关于图形绘制
今天在项目中有一个小需求,需要在视图上绘制一个圆,内部有一个点,点不能超出圆外,于是找了一些关于图形绘制方面的资料。以下只记录一些自己用到的知识点。
1.view的drawRect方法。该方法不能手动调用,是由系统自动调用的,在需要调用该方法时候,可以通过调用setNeedsDisplay方法,这时候系统会去调用drawRect方法。一般情况下,创建一个继承自UIView的类,在该类中重写drawRect方法。例如:
一个继承自UIView的类MyView,在其MyView.m文件中重写:
方法一:
-(void)drawRect:(CGRect)rect {
// 获取处理的上下文
CGContextRef context = UIGraphicsGetCurrentContext();
// 设置线条样式
CGContextSetLineCap(context, kCGLineCapRound);
// 设置线条粗细宽度
CGContextSetLineWidth(context, 1.0);
// 设置颜色
CGContextSetRGBStrokeColor(context, 0.5, 0.5, 0.5, 1);
// 开始一个起始路径
CGContextBeginPath(context);
// 画圆
CGContextAddArc(context, 120, 120, 60, 0, M_PI * 2, YES);
// 连接上面定义的坐标点
CGContextStrokePath(context);
}
方法二:
-(void)drawRect:(CGRect)rect {
// 创建UIBezierPath对象
UIBezierPath *bezierPath = [UIBezierPath bezierPath];
// 画圆
[bezierPath addArcWithCenter:CGPointMake(120, 120) radius:60 startAngle:0 endAngle:M_PI * 2 clockwise:YES];
// 设置线宽
bezierPath.lineWidth = 1;
// 设置stroke颜色
[[UIColor blackColor] setStroke];
// 绘制
[bezierPath stroke];
}
在控制器中添加该视图就能看到视图中的绘制的圆形 .
2.使用CAShapeLayer与UIBezierPath 绘图
使用CAShapeLayer与UIBezierPath 绘图可以实现不在view的drawRect方法中就画出一些想要的图形;
步骤:
1.新建UIBezierPath 对象bezierPath;
2.新建CAShapeLayer对象caShapeLayer;
3.将bezierPath的CGPath赋值给caShapeLayer的path,即caShapeLayer.path = bezierPath.CGPath;
4.把caShapeLayer添加到某个显示该图形的layer中。
例如,在viewController中作了如下操作
- (void)setUpUI {
CGPoint arcCenter = CGPointMake([UIScreen mainScreen].bounds.size.width/2, 120);
CGFloat radius = 80;
CGFloat startAngle = 0.0;
CGFloat endAngle = M_PI * 2;
// 创建 UIBezierPath对象
UIBezierPath *bezierPath = [UIBezierPath bezierPathWithArcCenter:arcCenter radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES];
// 创建CAShapeLayer对象
CAShapeLayer *layer = [[CAShapeLayer alloc] init];
layer.path = bezierPath.CGPath;
layer.fillColor = [UIColor clearColor].CGColor;
layer.strokeColor = [UIColor blackColor].CGColor;
layer.lineWidth = 5;
// 将CAShapeLayer对象添加到视图的layer中
[self.view.layer addSublayer:layer];
}
运行程序后,会看到视图中绘制的圆。