UITouch绘图,不使用贝塞尔曲线

首先简单介绍一下UITouch吧!

属相与方法:

  • window:触摸产生时所处的窗口。由于窗口可能发生变化,当前所在的窗口不一定是最开始的窗口。
  • view:触摸产生时所处的视图。由于视图可能发生变化,当前视图也不一定时最初的视图。
  • tapCount:轻击(Tap)操作和鼠标的单击操作类似,tapCount表示短时间内轻击屏幕的次数。因此可以根据tapCount判断单击、双击或更多的轻击。
  • timestamp: 时间戳记录了触摸事件产生或变化时的时间。单位是秒。
  • phase:触摸事件在屏幕上有一个周期,即触摸开始、触摸点移动、触摸结束,还有中途取消。通过phase可以查看当前触摸事件在一个周期中所处的状态;
    • phase是UITouchPhase类型的,包括:
typedef NS_ENUM(NSInteger, UITouchPhase) {
    UITouchPhaseBegan,  (开始)           // whenever a finger touches the surface.
    UITouchPhaseMoved,  (移动)           // whenever a finger moves on the surface.
    UITouchPhaseStationary,  (无移动)      // whenever a finger is touching the surface but hasn't moved since the previous event.
    UITouchPhaseEnded,     (结束)      // whenever a finger leaves the surface.
    UITouchPhaseCancelled, (取消)      // whenever a touch doesn't end but we need to stop tracking (e.g. putting device to face)
};
  • (CGPoint)locationInView:(UIView *)view:函数返回一个CGPoint类型的值,表示触摸在view这个视图上的位置,这里返回的位置是针对view的坐标系的。调用时传入的view参数为空的话,返回的时触摸点在整个窗口的位置。

  • (CGPoint)previousLocationInView:(UIView *)view:该方法记录了前一个坐标值,函数返回也是一个CGPoint类型的值, 表示触摸在view这个视图上的位置,这里返回的位置是针对view的坐标系的。调用时传入的view参数为空的话,返回的时触摸点在整个窗口的位置。

如何绘图:

  • 首先在- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 方法里添加曲线的起点;
    UITouch *touch = [touches anyObject];
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, nil, [touch locationInView:self].x, [touch locationInView:self].y);
    [self.totalPathPoints addObject:(__bridge_transfer id)path];

可以不使用CGMutablePathRef,可以用数组然后再将self.totalPathPoints这个数组存在一个一个的小数组;然后遍历也可以,方法有很多种;

__bridge_transfer 让非Objective-C对象转换为Objective-C对象
  • 然后在- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event与- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event两个方法里添加移动的路径;
 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    [self drawLineWithTouches:touches];
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [self drawLineWithTouches:touches];
}
-(void)drawLineWithTouches:(NSSet *)touches {
    UITouch *touch = [touches anyObject];
    CGMutablePathRef path = (__bridge_retained CGMutablePathRef)self.totalPathPoints.lastObject;
    CGPathAddLineToPoint(path, nil, [touch locationInView:self].x, [touch locationInView:self].y);
    [self setNeedsDisplay];
}
注意:用[self setNeedsDisplay]调用- (void)drawRect:(CGRect)rect才有效;不可以手动直接调用。
-(void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    for (id path in self.totalPathPoints) {
        CGMutablePathRef ref = (__bridge_retained CGMutablePathRef)path;
        CGContextAddPath(context, ref);
    }
    // 线段的宽度
    CGContextSetLineWidth(context, 5);
    [[UIColor blackColor] setStroke];
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineJoin(context, kCGLineJoinRound);
    CGContextStrokePath(context);
}
__bridge_retained 是将Objective-C对象转换为非Objective-C对象;Objective-C 和 Core Foundation 对象之间可以轻松的转换
UITouch绘图,不使用贝塞尔曲线_第1张图片
效果图

你可能感兴趣的:(UITouch绘图,不使用贝塞尔曲线)