app生命周期、控制器生命周期和事件传递、响应
2019-06-12 本文已影响0人
boy丿log
生命周期
app生命周期
app生命周期控制器生命周期
控制器生命周期事件
touch事件和手势
触摸事件首先传递到手势上,如果手势识别成功,就会取消事件的继续传递,否则,事件还是会被响应链处理。具体地,系统维持了与响应链关联的所有手势,事件首先发给这些手势,然后再发给响应链。
让手势向下传递需要实现以下方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
// 若为UITableViewCellContentView(即点击了tableViewCell),
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
// cell 不需要响应 父视图的手势,保证didselect 可以正常
return NO;
}
//默认都需要响应
return YES;
}
传递链
接收到触摸事件后,会从UIApplication->widow->view去寻找最合适的view,
- 首先判断主窗口(keyWindow)自己是否能接受触摸事件
- 判断触摸点是否在自己身上
- 子控件数组中从后往前遍历子控件,重复前面的两个步骤(所谓从后往前遍历子控件,就是首先查找子控件数组中最后一个元素,然后执行1、2步骤)
- 如果没有符合条件的子控件,那么就认为自己最合适处理这个事件,也就是自己是最合适的view。
即,响应链式从子视图到父视图的。
//先调用,如果hitTest:withEvent:方法中返回nil,那么调用该方法的控件本身和其子控件都不是最合适的view,也就是在自己身上没有找到更合适的view。那么最合适的view就是该控件的父控件。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
//后调用,判断点在不在当前view上(方法调用者的坐标系上)如果返回YES,代表点在方法调用者的坐标系上;返回NO代表点不在方法调用者的坐标系上,那么方法调用者也就不能处理事件。
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
从传递链开始调用这两个方法。即父视图调用->子视图调用。
不能触摸事件的三种情况
- userInteractionEnabled = NO
- 如果把父控件隐藏,那么子控件也会隐藏,隐藏的控件不能接受事件
- 如果设置一个控件的透明度<0.01,会直接影响子控件的透明度。alpha:0.0~0.01为透明。
传递过程
- 如果当前view是控制器的view,那么控制器就是上一个响应者,事件就传递给控制器;如果当前view不是控制器的view,那么父视图就是当前view的上一个响应者,事件就传递给它的父视图
- 在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理
- 如果window对象也不处理,则其将事件或消息传递给UIApplication对象
- 如果UIApplication也不能处理该事件或消息,则将其丢弃
UIView动画与CoreAnimation区别
UIView动画其实就是对Core Animation的一种封装,向客户程序员呈现更简洁的接口。
UIView是CALayer的代理。在block外面,这个方法将返回一个NSNull(是尖括号的null,nil打印出来是圆括号的null),而在block里面返回了一个叫做UIViewAdditiveAnimationAction类的对象,这个类是一个私有类,遵循了苹果一罐的命名规范: xxAction,一定就是一个实现了CAAction协议的对象了。