方法1
将以下代码直接添加到当前控制器中
cashapelayer * layer=[ cashapelayernew ];
layer.lineWidth=10;
//圆环的颜色
layer.stroke color=[ uicolorredcolor ].CG color;
//在背景中填充颜色
layer.fill color=[ uicolorclearcolor ].CG color;
//设置半径为100
CGFloat radius=100;
//顺时针方向
BOOL clockWise=true;
//初始化路径
uibezierpath * path=[ uibezierpathbezierpathwitharccenter 3360 self.view.center radius 3360 radius start angle 3360 (0) endddre
layer.path=[path CGPath];
[ self.view.layeraddsublayer : layer ]
使用以上方法创建UIBezierPath需要注意一些参数
uibezierpath * path=[ uibezierpathbezierpathwitharccenter 3360 radius 3360开始角度3360 endangle 3360 clockwise 3360 ];
第一个ArcCenter弧度中心,其类型为CGPoint
径向弧度半径
开始角度开始角度
末端终止角度
时钟是顺时针方向吗
note : bezier曲线只是规划了层的路径,无法实际表示,因此与CAShapeLayer组合使用
参考:绘制iOS贝塞尔曲线圆
方法2
使用UIView的drawRect以圆绘制UIBezierPath。 由于UIBezierPath无法直接在控制器上绘制,因此可以通过创建UIView子类并在UIView子类中重写drawRect方法来绘制uibezierpath bezier曲线。 方法如下
-(Void ) Drawrect:(CGrect ) rect {
//绘图代码
[self drawCircleMethodOne]
}
-(void ) drawCircleMethodOne
{
uibezierpath * path=[ [ uibezierpathalloc ] init ];
[ pathaddarcwithcenter 3360 cgpointmake (cgrectgetmidx (self.bounds ),cgrectgetmidy ) self.bounds ] radius 336050 star rdd
path.lineWidth=3;
[ [ uicoloryellowcolor ] set stroke ]
[path stroke];
}
初始化UIBezierPath与方法1相同,可以去看方法1的讲义。
这是设定曲线的颜色
[ [ uicoloryellowcolor ] set stroke ]
如果不在最后添加这个词,就不会绘制贝塞尔曲线
[path stroke];
方法3
该方法也用drawRect绘制
-(Void ) Drawrect:(CGrect ) rect {
//绘图代码
[self drawCircleMethodTwo]
}
-(void ) drawCircleMethodTwo
{
//线条颜色
ui color * color=[ uicolororangecolor ];
颜色集;
//画一个圆
uibezierpath * path=[ uibezierpathbezierpathwithovalinrect : cgrectmake (4,100,150,150 ) ];
//设定线宽
path.lineWidth=8;
//线的角
path.line cap style=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重绘
)两种自定义控件样式的方法各有优缺点,将CAShapeLayer与bezier曲线结合使用可以使绘制形状更加灵活,而drawRect只是一种方法,用于绘制大量规则的通用图形
) CALayer属性的变化默认为有动画,drawRect绘制中没有动画;
)3) CALayer绘制的图形是实时的,drawRect多次重绘需要手动调用setNeedsLayout;
)在性能方面,CAShapeLayer使用了硬件加速,绘制同样的图形比Core Graphics快很多。 CAShapeLayer是一种CoreAnimation框架,视频渲染直接提交给手机GPU,不占用内部空间,但Core Graphics占用大量的CPU资源。