美文网首页iOS技术
iOS中的UI事件传递&响应

iOS中的UI事件传递&响应

作者: 宋唐不送糖 | 来源:发表于2021-07-22 23:07 被阅读0次

UIView和CALayer之间的关系和区别

关系

1.UIView中有个属性layer(CALayer类型)和backgroundcolor。layer就指向了一个CALayer类型的变量。
2.实际上UIView的backgroundcolor是CALayer同名属性方法的一个包装(重写CALayer的backgroundcolor)。
3.UIView的显示部分是由CALayer的显示的内容contents来决定的。
4.contents对应的backing store实际上是bitmap类型的位图,最终我们显示到屏幕上面的对应UI控件可以理解为都是位图。

区别

1.UIView为其提供内容,以及负责处理触摸等事件,参与响应链
2.CALayer负责显示内容contents

为什么UIView只负责它的时间传递以及视图响应链这样的一个机制流程,而显示部分的工作都由CALayer来做呢?为什么如此设计?

遵循单一职责设计模式,体现了一个职责上的分工。

事件传递与视图响应链

点击ViewC2的的空白区域,系统是最终怎样的方式才找到了最终事件响应的视图是C2的呢?

事件传递流程

1.点击屏幕时首先将事件传递给UIApplication,UIApplication将事件传递给UIWindow。
2.UIWindow调用hitTest返回响应视图,先通过pointInside:判断是否在UIWindow范围内,如果在的话会通过倒序的方式遍历UIWIndow的子视图找出响应视图,最后添加的子视图会最先调用hitTest方法,递归调用hitTest返回找到的视图。

hitTest:withEvent内部实现流程图
 // 返回最终响应事件的视图view
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    if (!self.userInteractionEnabled ||
        [self isHidden] ||
        self.alpha <= 0.01) {
        return nil;
    }
    //pointInside:withEvent方法里面自定义点击条件
    if ([self pointInside:point withEvent:event]) {
        //遍历当前对象的子视图
        __block UIView *hit = nil;
        //NSEnumerationReverse 倒叙遍历
        [self.subviews enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            // 坐标转换
            CGPoint vonvertPoint = [self convertPoint:point toView:obj];
            //调用子视图的hittest方法
            hit = [obj hitTest:vonvertPoint withEvent:event];
            // 如果找到了接受事件的对象,则停止遍历
            if (hit) {
                *stop = YES;
            }
        }];
        
        if (hit) {
            return hit;
        }
        else{
            return self;
        }
    }
    else{
        return nil;
    }
}
 // 判断点击的位置是否在当前视图的范围内
- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event;  
视图事件响应方法
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
  • UIResponder的方法,UIView继承自UIResponder,响应触摸方法。
  • C2-->B2-->A-->UIView不处理触摸事件则一层层往上传递直到UIWindow(视图响应链)。
  • 如果传递到UIApplicationDelegate都不处理则忽略。


相关文章

  • iOS 响应链

    iOS开发 - 事件传递响应链iOS 响应者链,事件的传递事件传递之响应链Cocoa Touch事件处理流程--响...

  • iOS中的UI事件传递&响应

    UIView和CALayer之间的关系和区别 关系 1.UIView中有个属性layer(CALayer类型)和b...

  • iOS UI事件传递与响应者链

    iOS UI事件传递与响应者链 响应者链 响应者对象:继承自UIResponder的对象称之为响应者对象。UIAp...

  • 深入浅出iOS事件机制

    深入浅出iOS事件机制事件传递:响应链事件传递响应链

  • iOS-详解事件传递和响应者链

    事件响应 一、事件的分发和传递(确定事件的第一响应者): 1.当iOS程序中发生触摸事件后,系统会将事件加入到UI...

  • ios 事件传递和响应

    史上最详细的iOS之事件的传递和响应机制-原理篇iOS触摸事件传递响应之被忽视的手势识别器工作原理手势事件中can...

  • 响应者链浅谈

    响应者对象 响应者对象(Response object) 响应者对象就是可以响应事件并对事件作出处理。iOS中UI...

  • iOS基础知识整理之事件传递响应链

    事件传递响应链 UIResponder 在iOS中,能够响应事件的对象都是UIResponder的子类对象。UIR...

  • iOS- UI事件传递& 响应

    UI视图相关重要知识点 传送带: iOS- UITableView重用机制 iOS- UITableView数据源...

  • 初识iOS事情处理机制

    参考:史上最详细的iOS之事件的传递和响应机制-原理篇iOS触摸事件全家桶史上最详细的iOS之事件的传递和响应机制...

网友评论

    本文标题:iOS中的UI事件传递&响应

    本文链接:https://www.haomeiwen.com/subject/vonsmltx.html