代码改变世界

iOS-移动View跟随手指

2016-04-28 17:01  骨古  阅读(6949)  评论(0编辑  收藏  举报

一根或者多根手指在view上移动,系统会自动调用view的下面方法(随着手指的移动,会持续调用该方法)

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;

一根或者多根手指开始触摸view,系统会自动调用view的下面方法

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

一根或者多根手指离开view,系统会自动调用view的下面方法

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

触摸结束前,某个系统事件(例如电话呼入)会打断触摸过程,系统会自动调用view的下面方法

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

以上是UIView的触摸事件处理的流程方法

  • 下面是代码的实现
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NSLog(@"%@", touches);
    UITouch *touch = [touches anyObject];
    
    //当前的point
    CGPoint currentP = [touch locationInView:self];
    
    //以前的point
    CGPoint preP = [touch previousLocationInView:self];
    
    //x轴偏移的量
    CGFloat offsetX = currentP.x - preP.x;
    
    //Y轴偏移的量
    CGFloat offsetY = currentP.y - preP.y;
    
    self.transform = CGAffineTransformTranslate(self.transform, offsetX, offsetY);
}

UITouch

当用户的手指触摸屏幕的时,就会创建一个UITouch对象,注:一根手指对应一个UItouch对象

  • 作用

  • 保存一些与手指相关的消息,比如说触摸位置(CGPoint),时间。阶段

  • 当手指移动的时,系统会更新同一个UITouch对象

  • 手指离开时,就会销毁对应的UItouch

  • 获得当前的point

- (CGPoint)locationInView:(nullable UIView *)view;
  • 获得前一个位置的point
- (CGPoint)locationInView:(nullable UIView *)view;

然后计算出X轴,Y轴的偏移量

  • transform 在OC中,通过transform属性可以修改对象的平移、缩放比例和旋转角度
  • 常用的创建transform结构体方法分两大类
  1. 创建“基于控件初始位置”的形变

    CGAffineTransformMakeTranslation(平移)

    CGAffineTransformMakeScale(缩放)

    CGAffineTransformMakeRotation(旋转)

  2. 创建“基于transform参数”的形变

    CGAffineTransformTranslate

    CGAffineTransformScale

    CGAffineTransformRotate

要知道我们的每次的移动是在上一次的叠加基础上,所以要用CGAffineTransformTranslate(CGAffineTransform t,CGFloat tx, CGFloat ty).