您的位置:首页 > 移动开发 > IOS开发

iOS Quartz2D画圆角矩形时的线宽不一致问题->Quartz2D抗锯齿机制问题

2016-10-18 05:39 393 查看
转载自:http://www.jianshu.com/p/6f39f595d5b8

一般直接AddArc..或者用BezierPath,

+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius;

+(instancetype)ImageFromFrame:(CGSize)size
BorderColor:(UIColor *)color
BorderRadius:(CGFloat)radius
BorderWidth:(CGFloat)width
{
//创建上下文
CGFloat x = size.width;
CGFloat y = size.height;

UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
//获得上下文
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor (context,  1.0, 1.0, 1.0, 1.0);//设置填充颜色(白色)
CGContextSetLineWidth(context, width);//线的宽度
CGContextSetStrokeColorWithColor(context, color.CGColor);//线框颜色

//    CGPathRef clippath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0,0, x, y)cornerRadius:radius].CGPath;
//    CGContextAddPath(context, clippath);

CGContextMoveToPoint(context, x, y-radius);  // 开始坐标右边开始
CGContextAddArcToPoint(context, x, y, x-radius, y, radius);  // 右下角角度
CGContextAddLineToPoint(context, radius, y);
CGContextAddArcToPoint(context, 0, y, 0, y-radius, radius); // 左下角角度
CGContextAddLineToPoint(context, 0, radius);
CGContextAddArcToPoint(context, 0, 0, radius, 0, radius); // 左上角
CGContextAddLineToPoint(context, x-radius, 0);
CGContextAddArcToPoint(context, x, 0, x, radius, radius); // 右上角

CGContextClosePath(context);
CGContextDrawPath(context, kCGPathFillStroke); //根据坐标绘制路径
//3.取出图片
UIImage *newImage=UIGraphicsGetImageFromCurrentImageContext();
//4.结束上下文
UIGraphicsEndImageContext();

return newImage;
}

这个方法看上去没什么问题,的确是沿着路径画的,但是调试一下就会发现,画出来的圆角矩形圆角处的线宽和直线的线宽是不一致的,效果非常诡异.


9E7D47FF-40E5-4465-ACD7-0BC5F6983F4B.png

百度过滤了N页垃圾之后,后发现一篇有用的博文

跟Quartz2D的绘制时的抗锯齿机制有关

http://my.oschina.net/lych0317/blog/126215

具体原理看博文,不过里面的代码也是有问题的.

正确完美的解决方案如下:

路径要往里扣除线宽的一半 !!!!

+(instancetype)ImageFromFrame:(CGSize)size
BorderColor:(UIColor *)color
BorderRadius:(CGFloat)radius
BorderWidth:(CGFloat)width
{
//创建上下文
CGFloat x = size.width;
CGFloat y = size.height;

UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
//获得上下文
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor (context,  1.0, 1.0, 1.0, 1.0);//设置填充颜色(白色)
CGContextSetLineWidth(context, width);//线的宽度
CGContextSetStrokeColorWithColor(context, color.CGColor);//线框颜色

CGContextMoveToPoint(context, x-width/2, y-radius-width/2);  // 开始坐标右边开始
CGContextAddArcToPoint(context, x-width/2, y-width/2, x-radius-width/2, y-width/2, radius);  // 右下角角度
CGContextAddLineToPoint(context, radius+width/2, y-width/2);
CGContextAddArcToPoint(context, 0+width/2, y-width/2, 0 + width/2, y-radius+width/2, radius); // 左下角角度
CGContextAddLineToPoint(context, 0+width/2, radius+width/2);
CGContextAddArcToPoint(context, 0+width/2, 0+width/2, radius+width/2, 0+width/2, radius); // 左上角
CGContextAddLineToPoint(context, x-radius-width/2, 0+width/2);
CGContextAddArcToPoint(context, x-width/2, 0+width/2, x-width/2, radius+width/2, radius); // 右上角

CGContextClosePath(context);
CGContextDrawPath(context, kCGPathFillStroke); //根据坐标绘制路径
//3.取出图片
UIImage *newImage=UIGraphicsGetImageFromCurrentImageContext();
//4.结束上下文
UIGraphicsEndImageContext();

return newImage;
}



A2AC47A0-C9B5-48A8-86B9-8C498DC1C2C1.png
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Quartz2D