1、Touch事件

//系统自动调用

//一个UITouch代表一根手指 按住option变成两根手指

//虽然是两个手指,但只执行一次触摸事件

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {} 开始触摸事件

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {} 手指移动事件

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {} 结束触摸时间

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {} 取消触摸手势

  //获取任意手指

 

    UITouch * touch = [touches anyObject];

 //手指触摸的View

 

    NSLog(@"touch.view:%@",touch.view);

   //点击次数

    NSLog(@"点击次数:%ld",touch.tapCount);

 //当前手指的位置

 

    CGPoint currentPonit = [touch locationInView:touch.view];

 //上一次手指所处的位置

 

    CGPoint previousPonit = [touch previousLocationInView:touch.view];

2、事件分发

 事件产生和传递的过程:

 当发生触摸事件的时候,先传递给UIApplication,以队列结构接收事件。传递给主窗口,主窗口传递给控制器的UIView,遍历UIView的子视图,寻找最合适的UIView来接收。 

 响应者链:

 该类的上一级如果是UIView,子视图处理事件,如果处理不了,找他的父视图。

 该类的上一级如果是UIViewController,则是由所属的控制器来处理。

//返回最合适的UIView

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {}

//判断当前的点在不在View上

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {

    

    return YES;

 

}

3、UIImageView点击事件

    self.imageView.userInteractionEnabled = NO;

    //无法响应事件的3种情况:

    //1、当userInteractionEnabled未开启

    //2、当hidden属性为YES

    //3、当alpha属性为0时

    //将以YellowView为坐标系的点,转化为以button为坐标系的点 self = yellowView

    CGPoint buttonPoint = [self convertPoint:point toView:self.button];

这个函数的用处是判断当前的点击或者触摸事件的点是否在当前的view中。

   它被hitTest:withEvent:调用

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;   // default returns YES if point is in bounds

4、手机摇一摇

//事件的种类

- (void)motionBegan:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event {

    if (motion == UIEventSubtypeMotionShake) {

        NSLog(@"摇一摇");

    }    

 

}

5、**Gesture手势

 UIGestureRecognizerState:

 开始: UIGestureRecognizerStateBegan

 改变: UIGestureRecognizerStateChanged

 结束: UIGestureRecognizerStateEnded

 取消: UIGestureRecognizerStateCancelled

 

  失败: UIGestureRecognizerStateFailed,

//同时使用两个手势 捏合 旋转

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

    

    return YES;

 

}

(1)点击手势 Tap

    UITapGestureRecognizer * tap1 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction1:)];

    //点击一次便触发

    tap1.numberOfTapsRequired = 1;

    [self.imageView addGestureRecognizer:tap1];    

    UITapGestureRecognizer * tap2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction2:)];

    //双击一次便触发

    tap2.numberOfTapsRequired = 2;

    [self.imageView addGestureRecognizer:tap2];

    //如果tap2成功执行,让tap1失败

    [tap1 requireGestureRecognizerToFail:tap2];

(2)长按手势 LongPress
    UILongPressGestureRecognizer * longGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longAction:)];

    [self.imageView addGestureRecognizer:longGesture];

(3)轻扫手势  Swipe

UISwipeGestureRecognizer * swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeAction:)];

    //设置轻扫方向

    swipeGesture.direction = UISwipeGestureRecognizerDirectionLeft;

    [self.imageView addGestureRecognizer:swipeGesture];

(4)捏合事件 Pinch

    UIPinchGestureRecognizer * pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchAction:)];

    pinchGesture.delegate = self;

    [self.imageView addGestureRecognizer:pinchGesture];    

    self.pin = pinchGesture;

//对应事件

- (void)pinchAction:(UIPinchGestureRecognizer *)pin {

    self.imageView.transform = CGAffineTransformScale(self.imageView.transform, pin.scale, pin.scale);

    //复位

    pin.scale = 1;

    }

(5)旋转事件 Rotation

    UIRotationGestureRecognizer * rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationAction:)];

    rotationGesture.delegate = self;

    [self.imageView addGestureRecognizer:rotationGesture];

//对应事件

- (void)rotationAction:(UIRotationGestureRecognizer *)rotation {

 

    self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, rotation.rotation);    

    //复位

    rotation.rotation = 0;

 

}

(6)拖动手势 Pan

 UIPanGestureRecognizer * panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)];

 

    [self.imageView addGestureRecognizer:panGesture];

//对应事件

- (void)panAction:(UIPanGestureRecognizer *)pan {

    //获取拖动的偏移量

    CGPoint ponit = [pan translationInView:self.view];

    self.imageView.center = CGPointMake(self.imageView.center.x + ponit.x, self.imageView.center.y + ponit.y);

    //复位

    [pan setTranslation:CGPointZero inView:self.imageView];

}