响应链

Philm首页的拍摄按钮与滤镜是重叠的,且层级关系为拍摄按钮需要显示在最上层,同时要求滤镜可以滑动.这就需要使用响应链来处理重叠部分的响应顺序问题.

这里写图片描述

当发生触摸事件时,hitTest会检查触摸点所在位置,并从最底层开始,递归找出当前所有的响应器,记录为responder chain,并找出层级在最上方的view作为第一响应者.
所以当前的响应器链为: UIKit –> active app’s event queue –> window –> root view —> vc.view — > 滤镜view—>拍摄按钮view.其中 最上层的拍摄按钮为当前的第一响应者.
如果这个hit-test找出的这个view不能处理事件,那么UIKit会从响应器链中寻找nextResponder,这个responder可以决定响应事件还是继续寻找nextResponder.以此类推,直到找到可以响应的responder或者响应链全部被查找完.通过这个原理,处理上述问题的解决方案是:使拍摄按钮的view不响应触摸事件,而是传递给下层的滤镜view. 以下为具体代码:
 //图层穿透
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *hitView = [super hitTest:point withEvent:event];
    if(hitView == self)
    {
        return nil;
    }
    return hitView;
}
另外通过响应链,我们也可以寻找当前最上层的controller,这样在view层也可以实现push/present或其他controller才能做的操作而不需要使用代理/block一层层传递.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值