我想用 2 种不同颜色的 1px 线绘制双色线。我有很多代码,所以我在尝试解释后将其放入。
如果我使用 uiviewdrawRect
方法,当我关闭抗锯齿时它可以正常工作,但是当我使用图层时drawLayerInContext
,它要么显示一条普通线,要么显示一条 2px 的普通线,关闭抗锯齿,或者显示两条 2px 的半透明线,开启抗锯齿。
通过创建具有自定义上下文的图像,我设法获得了与 UIView 的 drawRect 方法类似的行为,我可以在其中指定比例:
UIGraphicsBeginImageContextWithOptions([self bounds].size, NO, 0.f); // 0.f for scale means "scale for device's main screen".
我只想知道为什么我没有得到相同的行为,drawInContext
以及是否有办法获得类似的行为。
这是绘制双色线的代码:
void DRAW_DOUBLE_LINE(CGContextRef ctx, CGPoint startPoint, CGPoint endPoint, UIColor* topColor, UIColor* bottomColor)
{
UIGraphicsPushContext(ctx);
UIBezierPath *topLine = [[UIBezierPath alloc] init];
CGPoint topLineStartPoint = startPoint;
CGPoint topLineEndPoint = endPoint;
[topLine moveToPoint:topLineStartPoint];
[topLine addLineToPoint:topLineEndPoint];
[topColor setStroke];
topLine.lineWidth = 0.5;
[topLine stroke];
UIBezierPath *bottomLine = [[UIBezierPath alloc] init];
CGPoint bottomLineStartPoint = topLineStartPoint;
bottomLineStartPoint.y +=0.5;
CGPoint bottomLineEndPoint = topLineEndPoint;
bottomLineEndPoint.y +=0.5;
[bottomLine moveToPoint:bottomLineStartPoint];
[bottomLine addLineToPoint:bottomLineEndPoint];
[bottomColor setStroke];
bottomLine.lineWidth = 0.5;
[bottomLine stroke];
UIGraphicsPopContext();
}
用我的drawRect
方法UIView
得到这个:
| 点y坐标| 抗锯齿 | 结果 | | ------------------- | ------------ | ------------------------------------------- | | 5 | 否 | 2 行 1 像素:宾果游戏!| | 5.25 | 否 | 2 行 1 像素:宾果游戏!| | 5.5 | 否 | 2 行 1 像素:宾果游戏!| | 5 | 是 | 1px的3条半透明线| | 5.25 | 是 | 2 行 1 像素:宾果游戏!| | 5.5 | 是 | 1px的3条半透明线|
在带有 drawInContext 的 CALayer 中,我得到了这些结果
| 点y坐标| 抗锯齿 | 结果 | | ------------------- | ------------ | ------------------------------------------- | | 5 | 否 | 2 行 2 像素 | | 5.25 | 否 | 1 行 2 像素 | | 5.5 | 否 | 1 行 2 像素 | | 5 | 是 | 2px的2条半透明线| | 5.25 | 是 | 1条2px的半透明线| | 5.5 | 是 | 2px的2条半透明线|
使用我的自定义上下文,我得到了这个:
| 点y坐标| 抗锯齿 | 结果 | | ------------------- | ------------ | ------------------------------------------- | | 5 | 否 | 2 行 1 像素:宾果游戏!| | 5.25 | 否 | 2 行 1 像素:宾果游戏!| | 5.5 | 否 | 2 行 1 像素:宾果游戏!| | 5 | 是 | 1px的3条半透明线| | 5.25 | 是 | 2 行 1 像素:宾果游戏!| | 5.5 | 是 | 1px的3条半透明线|
实现代码drawRect
:
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGPoint startPoint = CGPointMake(0, 5);
CGPoint endPoint = CGPointMake(CGRectGetMaxX(self.bounds),5);
UIColor* topLineColor = [UIColor whiteColor];
UIColor* bottomLineColor = [UIColor blackColor];
DRAW_DOUBLE_LINE(context, startPoint, endPoint, topLineColor, bottomLineColor);
}
实现代码drawInContext
:
-(void)drawInContext:(CGContextRef)ctx{
CGPoint startPoint = CGPointMake(0, 5);
CGPoint endPoint = CGPointMake(CGRectGetMaxX(self.bounds),5);
UIColor* topLineColor = [UIColor whiteColor];
UIColor* bottomLineColor = [UIColor blackColor];
DRAW_DOUBLE_LINE(ctx, startPoint, endPoint, topLineColor, bottomLineColor);
}
CALayer方法中自定义上下文实现代码display
:
-(void)display{
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
UIGraphicsBeginImageContextWithOptions([self bounds].size, NO, 0.f); // 0.f for scale means "scale for device's main screen".
} else {
UIGraphicsBeginImageContext([self bounds].size);
}
CGContextRef context = UIGraphicsGetCurrentContext();
CGPoint startPoint = CGPointMake(0, 5.25);
CGPoint endPoint = CGPointMake(CGRectGetMaxX(self.bounds),5.25);
UIColor* topLineColor = [UIColor whiteColor];
UIColor* bottomLineColor = [UIColor blackColor];
DRAW_DOUBLE_LINE(ctx, startPoint, endPoint, topLineColor, bottomLineColor);
UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.contents = (id)coloredImg.CGImage;
}