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

1、基本概念


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第1张图片


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第2张图片


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第3张图片


2、View的拖拽


2.1 界面


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第4张图片


2.2 实现思路


1> Storyboard拖一个View

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

3> UITouch


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第5张图片






iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第6张图片


4> touchMoved实现


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第7张图片


3、事件的产生和传递


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


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第8张图片


注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底层实现


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第9张图片


5、响应者链条


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第10张图片


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第11张图片


6、抽屉效果


6.1 界面


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第12张图片


6.2 实现思路


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

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


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第13张图片


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第14张图片


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


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第15张图片


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第16张图片


4> 定位 & 复位处理


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第17张图片


5> HMDrawViewController的封装

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

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

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

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


7、手势识别


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第18张图片


iOS开发 - 第02篇 - UI进阶 - 10 - 事件处理_第19张图片


你可能感兴趣的:(iOS开发,iOS开发笔记)