动画之事件处理

触摸事件简介

响应者对象

  • 只有继承了UIResponder的对象才能接受并处理对象事件,我们称为响应者对象
  • UIApplication,UIViewController,UIView等是响应者对象

UIResponder内部提供的处理事件的方法

比如触摸事件会调⽤用以下⽅方法:
- (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; 
加速计事件会调⽤用:
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event; 
远程控制事件会调⽤用:
- (void)remoteControlReceivedWithEvent:(UIEvent *)event;

UIView拖拽

  • 思路
    • 1.自定义UIView,实现监听⽅法.
    • 2.确定在TouchMove⽅法当中进⾏操作,因为⽤户⼿指在视图上移动的时候才需要移动视图。
    • 3.获取当前手指的位置和上⼀个⼿指的位置.
    • 4.当前视图的位置 = 上一次视图的位置 - ⼿手指的偏移量
  • 代码

    当⼿指在屏幕上移动时调⽤,持续调用
    NSSet:⾥面的元素都是⽆无序的.
    NSArray:⾥面的有顺序的.
    -(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    // 1.获取⼿指的对象
    UITouch *touch = [touches anyObject];
    // 2.获取当前⼿指所在的点.
    CGPoint curP = [touch locationInView: self]; 
    // 3.获取⼿指的上⼀个点.
    CGPoint preP = [touch previousLocationInView: self]; 
    CGFloat offsetX = curP.x - preP.x; //X轴⽅方向偏移量
    CGFloat offsetY = curP.y - preP.y; //Y轴⽅方向偏移量
    //  CGAffineTransformMakeTranslation:会清空上一次的形变. 
    //  self.transform = CGAffineTransformMakeTranslation(offsetX,0);
    self.transform = CGAffineTransformTranslate(self.transform, offsetX, offsetY);
    }

事件的产生和传递

  • 产生和传递:
    • 当发⽣一个触摸事件后,系统会将该事件⼊入到一个由UIApplication管理的事件队列中.
    • UIApplication会从事件队列中取出最前面的事件,交给主窗⼝keyWindow.
    • 主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件
    • 触摸事件的传递是从父控件传递到子控件的.
    • 如果一个父控件不能接收事件,那么它⾥面的子控件也不能够接收事件.
  • 什么时候控件不能接受事件
    • 1.不接收⽤户交互时不能够处理事件
      userInteractionEnabled = NO
    • 2.当一个控件隐藏的时候不能够接收事件 Hidden = YES的时候
    • 3.当一个控件为透明白时候也不能够接收事件 alpha < 0.01的时候
    • 注意:UIImageViewuserInteractionEnabled默认就是NO, 因此UIImageView以及它的子控件默认是不能接收触摸事件的

最合适的View---(hitText方法)

  • 1.先判断⾃己是否能够接收触摸事件,如果能再继续往下判断,
  • 2.再判断触摸的当前点在不在⾃己的身上.
  • 3.如果在⾃己身上,它会从后往前遍历子控件,遍历出每一个⼦控件后,重复前面的两个步骤.
  • 4.如果没有符合条件的子控件,那么它⾃己就是最适合的View.

转载于:https://www.cnblogs.com/LongLJ/p/6110255.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值