如何用UIBezierPath画线

本文讲述如何在UIView的子类中使用UIBezierPath来画图, 一般的使用方法都是在- (void)drawRect:(CGRect)rect的上下文中来画图. 现在我们来讲一讲如何不用指定上下文,在UIView中使用UIBezierPath.

一. 在子类中重写类方法+layerClass, 指定创建的图层为类CAShapeLayer 

// OTDrawView.m
+ (Class)layerClass {
        return[CAShapeLayer class];
}
 

二. 初始化

创建一个数组存储每次按下时点的位置, 设置背景为白色, 并声明我们不使用填充及指定画线的颜色.

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
       //Initialization code
             points = [[NSMutableArray alloc] init];
            
             self.backgroundColor = [UIColor whiteColor];
             ((CAShapeLayer *)self.layer).fillColor = nil;
             ((CAShapeLayer *)self.layer).strokeColor = [UIColor blackColor].CGColor;
    }
    return self;
}

三. 更新路径函数, 使用UIBezierPath根据记录的points数组, 按顺序将每条线描绘出来. 最重要的地方是把UIBezierPath的值赋给((CAShapeLayer *)self.layer).path

- (void)updatePaths
{
       if ([points count] >= 2) {
            
       UIBezierPath *path = [[UIBezierPath alloc] init];
       [path moveToPoint:[[points firstObject] CGPointValue]];
            
       NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, [points count] - 1)];
       [points enumerateObjectsAtIndexes:indexSet
                                                      options:0
                                                 usingBlock:^(NSValue *pointValue, NSUInteger idx, BOOL *stop) {
                                                       [path addLineToPoint:[pointValue CGPointValue]];
                                                 }];
             ((CAShapeLayer *)self.layer).path = path.CGPath;
       }
       else
       {
             ((CAShapeLayer *)self.layer).path = nil;
       }
}

四. 这是我们每个点生成的地方, 每按下一次屏幕, 就会把当前点存入points数组中, 再调用updatePaths更新路径.

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch =[touches anyObject];
    CGPoint point = [touch locationInView:self];
    [points addObject:[NSValue valueWithCGPoint:point]];
      
    [self updatePaths];
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值