使用CAShapeLayer与UIBezierPath可以实现不在view的drawRect方法中就画出一些想要的图形
步骤:
1、新建UIBezierPath对象bezierPath
2、新建CAShapeLayer对象caShapeLayer
3、将bezierPath的CGPath赋值给caShapeLayer的path,即caShapeLayer.path = bezierPath.CGPath
4、把caShapeLayer添加到某个显示该图形的layer中
下面的小例子是一个环形的progress代码,有具体的使用方法
.h文件:
 
- #import <QuartzCore/QuartzCore.h>  
 
- #import <UIKit/UIKit.h>  
 
-   
 
- @interface KACircleProgressView : UIView {  
 
-     CAShapeLayer *_trackLayer;  
 
-     UIBezierPath *_trackPath;  
 
-     CAShapeLayer *_progressLayer;  
 
-     UIBezierPath *_progressPath;  
 
- }  
 
-   
 
- @property (nonatomic, strong) UIColor *trackColor;  
 
- @property (nonatomic, strong) UIColor *progressColor;  
 
- @property (nonatomic) float progress;
 
- @property (nonatomic) float progressWidth;  
 
-   
 
- - (void)setProgress:(float)progress animated:(BOOL)animated;  
 
-   
 
- @end  
 
 
 
.m文件
 
- #import "KACircleProgressView.h"  
 
-   
 
- @implementation KACircleProgressView  
 
-   
 
- - (id)initWithFrame:(CGRect)frame  
 
- {  
 
-     self = [super initWithFrame:frame];  
 
-     if (self) {  
 
-         
 
-         _trackLayer = [CAShapeLayer new];  
 
-         [self.layer addSublayer:_trackLayer];  
 
-         _trackLayer.fillColor = nil;  
 
-         _trackLayer.frame = self.bounds;  
 
-           
 
-         _progressLayer = [CAShapeLayer new];  
 
-         [self.layer addSublayer:_progressLayer];  
 
-         _progressLayer.fillColor = nil;  
 
-         _progressLayer.lineCap = kCALineCapRound;  
 
-         _progressLayer.frame = self.bounds;  
 
-           
 
-         
 
-         self.progressWidth = 5;  
 
-     }  
 
-     return self;  
 
- }  
 
-   
 
- - (void)setTrack  
 
- {  
 
-     _trackPath = [UIBezierPath bezierPathWithArcCenter:self.center radius:(self.bounds.size.width - _progressWidth)/ 2 startAngle:0 endAngle:M_PI * 2 clockwise:YES];;  
 
-     _trackLayer.path = _trackPath.CGPath;  
 
- }  
 
-   
 
- - (void)setProgress  
 
- {  
 
-     _progressPath = [UIBezierPath bezierPathWithArcCenter:self.center radius:(self.bounds.size.width - _progressWidth)/ 2 startAngle:- M_PI_2 endAngle:(M_PI * 2) * _progress - M_PI_2 clockwise:YES];  
 
-     _progressLayer.path = _progressPath.CGPath;  
 
- }  
 
-   
 
-   
 
- - (void)setProgressWidth:(float)progressWidth  
 
- {  
 
-     _progressWidth = progressWidth;  
 
-     _trackLayer.lineWidth = _progressWidth;  
 
-     _progressLayer.lineWidth = _progressWidth;  
 
-       
 
-     [self setTrack];  
 
-     [self setProgress];  
 
- }  
 
-   
 
- - (void)setTrackColor:(UIColor *)trackColor  
 
- {  
 
-     _trackLayer.strokeColor = trackColor.CGColor;  
 
- }  
 
-   
 
- - (void)setProgressColor:(UIColor *)progressColor  
 
- {  
 
-     _progressLayer.strokeColor = progressColor.CGColor;  
 
- }  
 
-   
 
- - (void)setProgress:(float)progress  
 
- {  
 
-     _progress = progress;  
 
-       
 
-     [self setProgress];  
 
- }  
 
-   
 
- - (void)setProgress:(float)progress animated:(BOOL)animated  
 
- {  
 
-       
 
- }  
 
-   
 
-   
 
- @end  
 
 
使用:
 
- - (void)viewDidLoad  
 
- {  
 
-     [super viewDidLoad];  
 
-     
 
-     KACircleProgressView *progress = [[KACircleProgressView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];  
 
-     [self.view addSubview:progress];  
 
-     progress.trackColor = [UIColor blackColor];  
 
-     progress.progressColor = [UIColor orangeColor];  
 
-     progress.progress = .7;  
 
-     progress.progressWidth = 10;  
 
- }  
 
 
 
最后上一张效果图:

 
使用CAShapeLayer与UIBezierPath画出想要的图形
原文:http://www.cnblogs.com/wanghuaijun/p/5552105.html