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,

  1. 首先判断主窗口(keyWindow)自己是否能接受触摸事件
  2. 判断触摸点是否在自己身上
  3. 子控件数组中从后往前遍历子控件,重复前面的两个步骤(所谓从后往前遍历子控件,就是首先查找子控件数组中最后一个元素,然后执行1、2步骤)
  4. 如果没有符合条件的子控件,那么就认为自己最合适处理这个事件,也就是自己是最合适的view。

即,响应链式从子视图到父视图的。

//先调用,如果hitTest:withEvent:方法中返回nil,那么调用该方法的控件本身和其子控件都不是最合适的view,也就是在自己身上没有找到更合适的view。那么最合适的view就是该控件的父控件。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
//后调用,判断点在不在当前view上(方法调用者的坐标系上)如果返回YES,代表点在方法调用者的坐标系上;返回NO代表点不在方法调用者的坐标系上,那么方法调用者也就不能处理事件。
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

从传递链开始调用这两个方法。即父视图调用->子视图调用。

不能触摸事件的三种情况

传递过程

UIView动画与CoreAnimation区别

UIView动画其实就是对Core Animation的一种封装,向客户程序员呈现更简洁的接口。
UIView是CALayer的代理。在block外面,这个方法将返回一个NSNull(是尖括号的null,nil打印出来是圆括号的null),而在block里面返回了一个叫做UIViewAdditiveAnimationAction类的对象,这个类是一个私有类,遵循了苹果一罐的命名规范: xxAction,一定就是一个实现了CAAction协议的对象了。

上一篇下一篇

猜你喜欢

热点阅读