iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理

1、基本概念








2、View的拖拽


2.1 界面




2.2 实现思路


1> Storyboard拖一个View

2> 由于需要监听View的触摸事件,因此需要自定义一个HMView类(并在Storyboard中关联自定义View),并实现上述UIView的触摸事件

3> UITouch










4> touchMoved实现




3、事件的产生和传递


发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中,UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow),主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,但是这仅仅是整个事件处理过程的第一步,找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理touchesBegan->touchesMoved->touchedEnded。




注1:UIView不接收触摸事件的三种情况:不接收用户交互:userInteractionEnabled= NO;隐藏:hidden= YES;透明:alpha= 0.0 ~ 0.01;

注2:UIImageView的userInteractionEnabled默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的;


4、hitTest方法 --- 重要


4.2 hitTest方法作用


UIApplication -> UIWindow

什么时候调用:当事件传递给一个控件的时候就会调用

作用:找最合适的view

hitTest:withEvent: return (UIView *)

1> 看窗口是否能接收。如果不能return nil;自己不能接收事件,也不能处理事件,而且也不能把事件传递给子控件

2> 判断点在不在窗口上,如果点在窗口上,意味着窗口满足合适的view

3> 循环上述步骤,遍历子控件的viewhitTest:withEvent: 查找最合适的View


4.2 hitTest底层实现




5、响应者链条






6、抽屉效果


6.1 界面




6.2 实现思路


1> 抽象出一个自定义HMDrawViewController(继承自UIViewController),并将Storyboard中关联的HMViewController继承自HMDrawViewController,专门用来做抽屉效果

2> 在HMDrawViewController中搭建界面 & touch事件处理






3> KVO监听frame改变 & frame缩放






4> 定位 & 复位处理




5> HMDrawViewController的封装

@property (nonatomic, weak, readonly) UIView *mainView;

@property (nonatomic, weak, readonly) UIView *leftView;

@property (nonatomic, weak, readonly) UIView *rightView;

注意需要readonly,在其子类中只能往leftView等addSubViews:


7、手势识别






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值