方法一
在当前的控制器中直接加入下面代码
CAShapeLayer *layer = [CAShapeLayer new];
layer.lineWidth = 10;
//圆环的颜色
layer.strokeColor = [UIColor redColor].CGColor;
//背景填充色
layer.fillColor = [UIColor clearColor].CGColor;
//设置半径为100
CGFloat radius = 100;
//按照顺时针方向
BOOL clockWise = true;
//初始化一个路径
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:self.view.center radius:radius startAngle:(0) endAngle:M_PI*2 clockwise:clockWise];
layer.path = [path CGPath];
[self.view.layer addSublayer:layer];
这个上面的方法中创建UIBezierPath有几个参数需要注意下
UIBezierPath * path = [UIBezierPath bezierPathWithArcCenter:<#(CGPoint)#> radius:<#(CGFloat)#> startAngle:<#(CGFloat)#> endAngle:<#(CGFloat)#> clockwise:<#(BOOL)#>];
第一个ArcCenter弧度的中心,其类型是CGPoint
radius弧度的半径
startAngle开始角度
endAngle结束角度
clockwise是否顺时针
NOTE:贝塞尔曲线只是规划了一个Layer的路径,而不能真正的展示出来,所以要和CAShapeLayer搭配使用
参考:iOS贝塞尔曲线画圆
方法二
利用UIView中drawRect去绘制UIBezierPath画圆。由于UIBezierPath在控制器中不能直接绘制出来,那么我们可以建一个UIView的子类,在UIView的子类中通过重写drawRect方法去绘制UIBezierPath贝赛尔曲线。方法如下
- (void)drawRect:(CGRect)rect {
// Drawing code
[self drawCircleMethodOne];
}
- (void)drawCircleMethodOne
{
UIBezierPath * path = [[UIBezierPath alloc] init];
[path addArcWithCenter:CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)) radius:50 startAngle:0.0 endAngle:M_PI*2.0 clockwise:YES];
path.lineWidth = 3;
[[UIColor yellowColor] setStroke];
[path stroke];
}
初始化UIBezierPath跟方法一是一样的,可以去看方法一的讲解。
这句是设置曲线的颜色
[[UIColor yellowColor] setStroke];
最后得加上这句,贝赛曲线才会绘制
[path stroke];
方法三
这方法也是在drawRect进行绘制的
- (void)drawRect:(CGRect)rect {
// Drawing code
[self drawCircleMethodTwo];
}
- (void)drawCircleMethodTwo
{
//线条颜色
UIColor *color = [UIColor orangeColor];
[color set];
//绘制圆形
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(4, 100, 150, 150)];
//设置线宽
path.lineWidth = 8;
//线条拐角
path.lineCapStyle = kCGLineCapRound;
//终点处理
path.lineJoinStyle = kCGLineJoinRound;
//根据坐标点连线
[path stroke];
}
drawRect的知识点
drawRect介绍
drawRect是UIView类的一个方法,在drawRect中所调用的重绘功能是基于Quartz 2D实现的,Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Mac OS X环境。利用UIKit框架提供的控件,我们能实现一些简单的UI界面,但是,有些UI界面比较复杂,用普通的UI控件无法实现,或者实现效果不佳,这时可以利用Quartz 2D技术将控件内部的结构画出来,自定义所需控件,这也是Quartz 2D框架在iOS开发中一个很重要的价值。
- 我们只能在继承了UIView的子类中通过重写drawRect方法来绘制图形。
- 如果需要绘制图形的子类直接继承自UIView,则子类的drawRect方法中不需要调用父类方法[super drawRect:rect];。如果子类继承自其他继承UIView的View类,则drawRect方法中需要调用父类方法[super drawRect:rect];。
- drawRect方法不能手动直接调用,我们可以通过调用其他方法来实现drawRect方法的调用。如:在子类初始化时调用- (instancetype)initWithFrame:(CGRect)frame方法,且frame不为CGRectZero时。
- 我们可以调用setNeedsDisplay()方法或setNeedsDisplayInRect方法,但是该方法不会自己调用drawRect方法,而是会标记视图,并在下一次循环更新的时候让视图通过drawRect来进行重绘,前提是rect不为CGRectZero。
CAShapeLayer绘图与drawRect重绘的比较
(1)两种自定义控件样式的方法各有优缺点,CAShapeLayer配合贝赛尔曲线使用时,绘图形状更灵活,而drawRect只是一个方法而已,在其中更适合绘制大量有规律的通用的图形;
(2)CALayer的属性变化默认会有动画,drawRect绘图没有动画;
(3)CALayer绘制图形是实时的,drawRect多次重绘需要手动调用setNeedsLayout;
(4)性能方面,CAShapeLayer使用了硬件加速,绘制同一图形会比用Core Graphics快很多,CAShapeLayer属于CoreAnimation框架,动画渲染直接提交给手机GPU,不消耗内,而Core Graphics会消耗大量的CPU资源。
网友评论