iOS Quartz2D画圆角矩形时的线宽不一致问题->Quartz2D抗锯齿机制问题
2016-10-18 05:39
393 查看
转载自:http://www.jianshu.com/p/6f39f595d5b8
这个方法看上去没什么问题,的确是沿着路径画的,但是调试一下就会发现,画出来的圆角矩形圆角处的线宽和直线的线宽是不一致的,效果非常诡异.
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/9797460fe1b4459d66be8ae95ef84d1a)
9E7D47FF-40E5-4465-ACD7-0BC5F6983F4B.png
http://my.oschina.net/lych0317/blog/126215
具体原理看博文,不过里面的代码也是有问题的.
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/68d6757bc28495300615725f768623dd)
A2AC47A0-C9B5-48A8-86B9-8C498DC1C2C1.png
一般直接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
相关文章推荐
- ios-day14-01(使用Quartz 2D绘制基本图形——线、三角形、矩形、圆、圆弧、扇形、文字、图片等)
- Quartz2D简单绘制之圆角矩形
- iOS开发UI篇—Quartz2D使用(把图片绘制到Bitmap上>输出图片)
- ios-day15-01(Quartz 2D之画圆的两种方式、画矩形的4种方式)
- iOS开发UI-利用Quartz2D 实现基本绘图(画三角形、矩形、圆、圆弧)
- iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)
- <iOS>解决自定义相机的打开时动画不一致问题
- iOS Quartz2D - 画矩形
- iOS开发之Quartz2D 二:绘制直线,曲线,圆弧,矩形,椭圆,圆
- Quartz2D IOS绘图 线 椭圆 矩形 贝塞尔曲线 弧
- iOS基础知识<Quartz2D>
- iOS:quartz2D绘图(画一些简单的图形,如直线、三角形、圆、矩形、文字等)
- iOS Quartz 2D 绘制图形(线段\三角形\矩形\圆\圆弧等)
- iOS开发笔记>> Quartz2D简单介绍
- iOS中Quartz2D的画圆弧问题
- iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)
- iOS开发UI篇—Quartz2D简单图形绘制(二)直线,三角形,矩形,扇形,弧,圆
- iOS 绘图机制简介,Quartz 2D绘图用CGContextRef绘制音频波形图 —— HERO博客
- iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)
- iOS开发UI-利用Quartz2D 实现基本绘图(画三角形、矩形、圆、圆弧)