1. iOS事件处理机制
iOS应用程序是事件驱动型的。
分两步:a. 分发事件
b. 响应事件
[分发事件]
在发生触摸后,事件加入到UIApplication事件队列(UIApplication接收消息,分发事件,它始终在循环监听用户操作),UIApplication从事件队列中取出最前面的事件进行分发处理。
分发的顺序:从->window开始依次向上。
分发的判断依据:判断触摸点是否在当前视图内:
if ( 触摸点 in 当前视图 ){
遍历其子视图;
递归判断触摸点是否在子视图上;
一直遍历完所有子视图,找到直接与触摸相接的那个视图;
/*判断过程中,若视图的的hidden= YES 或者 userInteractionEnabled = NO 或者 alpha < 0.1 ,会直接返回。
一般UIView及其子类 userInteractionEnabled = YES, 个别为NO,如UILabel , UIImageView.
*/
}
else {
直接返回;
}
[响应事件]
找到触摸到的视图后,判断其是否实现了处理事件的方法。
若未实现,则将事件向上传递,同样进行判断。
若实现了,则停止传递。
这个过程是在一个“响应链”中,要处理事件的视图,都有下一响应者,一直到顶端,若都没有实现处理事件的方法,则事件会被丢弃。
UIApplicationDelegate <- UIWindow <- UIViewController<- UIView <- UIView;
2. 触摸事件处理
// 触摸开始
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
// 触摸移动
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullableUIEvent *)event;
// 触摸结束
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullableUIEvent *)event;
//触摸取消(因系统事件进入,如电话)
- (void)touchesCancelled:(nullableNSSet<UITouch *> *)touches withEvent:(nullableUIEvent *)event;
加速计(运动)处理
// 加速开始
- (void)motionBegan:(UIEventSubtype)motion withEvent:(nullableUIEvent *)event NS_AVAILABLE_IOS(3_0);
// 加速结束
- (void)motionEnded:(UIEventSubtype)motion withEvent:(nullableUIEvent *)event NS_AVAILABLE_IOS(3_0);
// 加速取消
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(nullableUIEvent *)event NS_AVAILABLE_IOS(3_0);
3. 手势
触摸事件使用比较容易,但不易处理多个手指触摸时分辨不同的操作,由此引入手势识别,将用户常用的的手势操作封装成不同的类供使用。
手势类:UIGestureRecognizer 是一个抽象类,是所有手势类的父类,定义了手势的基本行为。不能直接使用,只能使用其子类对象。
常用手势类:
UITapGestureRecognizer // 点击
UIPinchGestureRecognizer // 捏合
UIPanGestureRecognizer // 拖曳
UISwipeGestureRecognizer // 轻扫
UIRotationGestureRecognizer // 旋转
UILongPressGestureRecognizer // 长按
手势类使用:
> 初始化
.. alloc] init]
> 手势的属性(较少设置)
.numberOfTapsRequired // 点击次数
.numberOfTouchesRequired // 需要几根手指点击
> 添加/监听手势的触发
addTarget:action:
> 添加手势类对象到对应的视图上
[view addGestureRecognizer:]
>> 手势冲突
//如果一个手势A的识别部分是另一个手势B的子部分时,默认情况下A就会先识别,B就无法识别了
(void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer
>> 不同控件的手势同时执行,对于父子视图间的
使用UIGestureRecognizerDelegate
(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
/* 判断otherGestureRecognizer 的视图是哪一个,返回yes表示继续向下传递事件,否则不传递 */
——————————————————————————————
MVC
MVC是一种软件设计模式。广泛应用于用户交互的应用程序中。在iOS的开发中这种机制是处处都有体现。
模型-视图-控制器(Model-View-Controller,MVC).
模型对象:封装了应用程序的数据,并定义操控和处理该数据的逻辑和运算。
视图对象: 是应用程序中用户可以看得见的对象。提供接口(界面)与用户交互。[所有控件,窗口都继承自UIView].
控制器对象:在应用程序的一个或多个视图对象和一个或多个模型之间,控制器对象充当媒介。
MVC是一种软件设计模式。广泛应用于用户交互的应用程序中。在iOS的开发中这种机制是处处都有体现。
模型-视图-控制器(Model-View-Controller,MVC).
模型对象:封装了应用程序的数据,并定义操控和处理该数据的逻辑和运算。
视图对象: 是应用程序中用户可以看得见的对象。提供接口(界面)与用户交互。[所有控件,窗口都继承自UIView].
控制器对象:在应用程序的一个或多个视图对象和一个或多个模型之间,控制器对象充当媒介。
通信约束:
Model和View永远不能相互通信,只能通过Controller传递。
Controller可以直接与Model对话(读写Model),Model通过通知的形式与Controller 间接通信。
Controller 可以直接与View对话,直接操作View. View 通过target-action形式,及delegate的形式与Controller间接通信。