首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

iOS中的事件的产生和传递

3.判断keyWindow是否能接受触摸事件 4.判断触摸点是否自己身上 5.控件数组中从后往前遍历控件,重复前面的两个步骤 6.View,比如testView,那么会把这个事件交给这个testView...注 :如果hitTest:withEvent:方法中返回nil,那么调用该方法的控件本身和其控件都不是最合适的view,也就是自己身上没有找到更合适的view。...image.png 1.如果当前view是控制器的view,那么控制器就是上一个响应者,事件就传递给控制器;如果当前view不是控制器的view,那么父视图就是当前view的上一个响应者,事件就传递给它的父视图...2.视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理 3.如果window对象也不处理,则其将事件或消息传递给UIApplication对象...;如果上级视图仍然无法处理则会继续往上传递;一直传递到视图控制器view controller,首先判断视图控制器的根视图view是否能处理此事件;如果不能则接着判断该视图控制器能否处理此事件,如果还是不能则继续向上传

91010
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    史上最详细的iOS之事件的传递和响应机制-原理篇

    :如果hitTest:withEvent:方法中返回nil,那么调用该方法的控件本身和其控件都不是最合适的view,也就是自己身上没有找到更合适的view。...控制器的view的hitTest:withEvent:方法return nil或者window的hitTest:withEvent:方法return self return nil的含义: hitTest...如果当前view是控制器的view,那么控制器就是上一个响应者,事件就传递给控制器;如果当前view不是控制器的view,那么父视图就是当前view的上一个响应者,事件就传递给它的父视图 2>视图层次结构的最顶级视图...controller,首先判断视图控制器的根视图view是否能处理此事件;如果不能则接着判断该视图控制器能否处理此事件,如果还是不能则继续向上传 递;(对于第二个图视图控制器本身还在另一个视图控制器中,...则继续交给父视图控制器的根视图,如果根视图不能处理则交给父视图控制器处理);一直到 window,如果window还是不能处理此事件则继续交给application处理,如果最后application还是不能处理此事件则将其丢弃

    11.1K70

    iOS头部渐变的表格视图设计 原

    iOS头部渐变的表格视图设计         今天再来给大家带来一个开发中常用到的视图控制器很多应用中,可能都会遇到这样的一个需求:表视图控制器最上方有一个头图控件,当表格视图滑动顶部时,导航栏透明...,当表格视图逐渐向下滑动时,导航栏渐渐出现,并且滑动期间,头图会展示相关的渐变动画效果。...All rights reserved. /*  *  这个视图控制器创建出带缩放头图效果的视图控制器  *  tip:  *      1.这个视图控制器如果是被导航push出来的 则内部会使用假导航进行渐隐模拟... *      2.这个视图控制器如果是被present出来的 则不会出现假导航栏  *      3.这个视图控制器中自带一个TableView 设置TableView的头图不会影响原动画效果  *...,我主要考虑两个需要优化的地方,第一是这个控制器不同的场景下可能会有不同的结构,例如在导航结构中被push出来或者通过模态跳转被present出来,我在这个控件的实现时做了兼容,实际无论有无导航,控件内部都没有使用系统的导航栏

    1.2K20

    iOS面试题:事件传递和响应机制

    事件的传递 触摸事件的传递是从父控件传递到控件 也就是UIApplication->window->寻找处理事件最合适的view 注 : 如果父控件不能接受触摸事件,那么子控件就不可能接收到触摸事件...1.首先判断主窗口(keyWindow)自己是否能接受触摸事件 2.判断触摸点是否自己身上 3.控件数组中从后往前遍历控件,重复前面的两个步骤(所谓从后往前遍历控件,就是首先查找控件数组中最后一个元素...,也不管触摸点在不在这个控件,事件都会先传递给这个控件,随后再调用hitTest:withEvent:方法 2.如果hitTest:withEvent:方法中返回nil,那么调用该方法的控件本身和其控件都不是最合适的...view,也就是自己身上没有找到更合适的view。...view是控制器的view,那么控制器就是上一个响应者,事件就传递给控制器;如果当前view不是控制器的view,那么父视图就是当前view的上一个响应者,事件就传递给它的父视图 2 视图层次结构的最顶级视图

    1.2K10

    iOS架构入门 - MVC模式实例演示

    除此之外,此模式通过对复杂度的简化,使程序结构更加直观 控制器(Controller)--> 负责转发请求,对请求进行处理。 视图(View) --> 界面设计人员进行图形界面设计。...层的中介,把Model数据View展示出来 目的: 低耦合,可复用 image 先看这张图,这张图是iOS的MVC架构中最经常出现的图了吧,因为IOS中的Controlller 是 UIViewController...: 导致Controller特别臃肿,里面代码特别多,视图一复杂起来,代码量可能过1000行,不好维护 写在Controller里无法复用,除非你 VC2里面 copy 当前VC中的 View的代码...Controller减压,不该控制器管的他别让他知道,如上基础MVC操作之后的优势: MVC架构分明,同一个模块内,如果视图有问题,找到该模块的View就行,其他同理,Controller代码大大减少...其实TableView也可以剥离到外部,不放在Controller中,我也有Demo是那么做的,后来发现没必要,感觉还特意封出去感觉有点画蛇添足,因为我这种架构,其实tableView很多方法都在基类控制器里面的

    1.3K00

    iOS的MVC框架之控制层的构建(下)

    我的iOS的MVC框架之控制层的构建()一文中介绍了一些控制层的构建方法,而这篇文章则继续对一些方法进行展开讨论。...这样就不必默认的根视图上再建立滚动视图或者列表视图了。...通过SB和XIB的使用就可以简化我们对视图部分的构建。在实践中你会发现如果你是通过代码来完成视图的构建和布局那么这部分代码就有可能超过你控制器50%的代码行数。...//然后适当的时候调用视图控制器的下面这两个方法来实现呈现的自定义控制处理。 //这两个方法是对子视图控制器进行的调用,并且要成对执行。...答案就是路由,也就是我们处理界面跳转时不直接构建目标视图控制器而是通过一个中介者路由来实现界面的跳转。关于路由来进行页面跳转的解决方案网络已经有很多的开源库或者实现方式了,这里就不再赘述了。

    4.4K30

    Swift 基于闭包的类型擦除

    init(modelLoader: T) where T.Model == MyModel { ... } } 这是有效的,但由于我们还希望我们的视图控制器中引用我们的模型加载程序...T 只我们的初始化程序的上下文中知道,因此我们无法定义T类型的属性,除非我们使视图控制器类本身成为泛型 - 这将非常迅速使我们进一步陷入到处都是通用课程的兔子洞中(down into a rabit...hole 出自爱丽丝梦游记,只简单的事情变得越来来复杂和荒谬)。...但是,事实证明,我们实际可以直接在我们的视图控制器中进行基于闭合的类型擦除 ——而不是必须通过 AnyModelloader 类。..., bundle: nil) } } 与我们的类型擦除类 AnyModelloader 一样,我们可以参考 load 函数作为闭包的实现,并只需我们的视图控制器中保存引用。

    1.2K20

    Swift 基于闭包的类型擦除

    init(modelLoader: T) where T.Model == MyModel { ... } } 这是有效的,但由于我们还希望我们的视图控制器中引用我们的模型加载程序...T只我们的初始化程序的上下文中知道,因此我们无法定义T类型的属性,除非我们使视图控制器类本身成为泛型 - 这将非常迅速使我们进一步陷入到处都是通用课程的兔子洞中(down into a rabit hole...出自爱丽丝梦游记,只简单的事情变得越来来复杂和荒谬)。...但是,事实证明,我们实际可以直接在我们的视图控制器中进行基于闭合的类型擦除 ——而不是必须通过AnyModelloader类。..., bundle: nil) } } 与我们的类型擦除类AnyModelloader一样,我们可以参考load函数作为闭包的实现,并只需我们的视图控制器中保存引用。

    1.1K20

    【IOS开发基础系列】UIView专题

    iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow,于是控制器的view就显示屏幕上了。...注意这个控制器属性面板的“初始化控制器属性”。...- (BOOL)isDescendantOfView:(UIView *)view 参数 view     一个视图用来测试视图视图层次中的关系 返回值     如果接收者是视图视图就返回YES...2.容器视图中设置转换。 3.容器视图中移除视图。 4.容器视图中添加视图。 5.结束动画块。...如果一个视图的区域超过父视图的bound区域(父视图的clipsToBounds属性为NO,这样超过父视图bound区域的视图内容也会显示),那么正常情况下对子视图视图之外区域的触摸操作不会被识别

    62930

    iOS 二级菜单(UITableView实现)「建议收藏」

    ; 下面我说一下大体的思路吧; 当选中cell的时候看看这个cell有没有菜单,如果没有很简单直接打开就行了; 如果有那么我们先将这些菜单想办法添加到掌管父菜单的数组中,然后生成一个位置数组(为了...uitableview的数组,里面存放的是tablecell @property (nonatomic,strong) NSMutableArray * InsertArry;//中间处理过程数组,用于插入视图...@property (nonatomic,strong) NSMutableArray * DeleteArry;//中间处理过程数组,用于删除视图 -(NSArray *) insertOperation..."; cell0.Comments.text = @"菜单"; cell0.ChildArray=nil; NSMutableArray *array = [[NSMutableArray...item.ChildArray objectAtIndex:i]; [_DeleteArry addObject:child];//添加到删除数组 } item.Open = NO;//设置视图关闭

    1.3K30

    Swift-MVVM 简单演练(一)

    ) 设置控制器 HQMainViewController中设置四个控制器 用extension将代码拆分 通过反射机制,获取控制器类名,创建控制器 设置每个子控制的tabBar图片及标题 HQMainViewController...基类控制器的setupUI(设置界面)的方法里面,我们直接创建了tableView,那么我们如果有一个标记,能根据这个标记来选择是创建普通视图,还是创建访客视图。就可以很好的解决此类问题了。...到目前为止,虽然我们只是基类控制器里面创建了访客视图setupVistorView,只有一个访客视图的HQVistorView,但是实际上当我们点击不同的控制器的时候,每个子控制器都会创建一个访客视图...点击四个控制器的时候,访客视图打印的地址都不一样。...总结 使用代理传递消息是为了控制器视图之间解耦,让视图能够被多个控制器复用,如TableView 但是,如果视图仅仅是为了封装代码,而从控制器中剥离出来的,并且能够确认该视图不会被其它控制器引用,

    10.3K51

    Swift 项目 - Xib | StoryBoard 多人协作技巧

    VC处置 视图的初始样式应尽量Storyboard上属性面板中设置,非极特殊情况,布局也应在Storyboard使用各种约束配合完成。...一个占位的容器视图指向控制器的Embed Segue 按住Control键连线到想要包含的控制器,占位视图的实例==控制器的view(控制器视图) 选择Embed连线方式后,控制器 的尺寸变化成跟占位视图一样的尺寸...这样我们可以将功能图标的CollectionView的代码放到这第一个控制器,CollectionViewDelegate、CollectionViewDataSource等代码也由控制器实现...同理,优惠专区可以再添加一个Container View,指向第二个控制器。...中的viewDidLoad方法中,self.parent 是nil,这时不能拿到主ViewController实例。

    2.1K20

    ViewController及View的生命周期1. 起因2. Controller的生命周期3. View的生命周期4. 内存警告

    为了能够进一步搞清楚之间的区别,我们不同屏幕运营一下这两个方法看看调度的时间点。我们将Xcode默认使用5S去设置一下,屏幕大小是320*568,但是如果运行在6s上会怎么样。...: isMovingFromParentViewController 会在viewWillDisappear & viewDidDisappear 方法内部调用这个方法判断视图控制器视图的隐藏是否因为视图控制器从它的容器视图控制器移除...,与上面被其它视图控制器显示对应,如信息录入完成,返回之前的视图控制器)。...视图移动前会发出willMoveToSuperview:回调 didMoveToWindow:回调和didMoveToSuperview:相似,从命名能看出其区别。...willMoveToWindow:视图移动前发出的回调。 willRemoveToSubview:回调通知父视图视图即将被删除 4. 内存警告 首先要判断一下,当前view有没有被显示。

    1.4K30

    如何判断 ScrollView、List 是否正在滚动中

    SwiftUI 中,视图可以通过 preference 视图修饰器向其祖先视图传递信息( PreferenceKey )。...preference 与 onChange 的调用时机非常类似,只有值发生改变后才会传递数据。 ScrollView、List 发生滚动时,它们内部的视图的位置也将发生改变。...} }}// 添加与 ScrollView、List 的视图之上,用于在位置发生变化时发送信息func scrollSensor() -> some View {...我正以聊天室、Twitter、博客留言等讨论为灵感,从中选取有代表性的问题和技巧制作成 Tips ,发布 Twitter 。...每周也会对当周博客的新文章以及 Twitter 发布的 Tips 进行汇总,并通过邮件列表的形式发送给订阅者。订阅下方的 邮件列表[9],可以及时获得每周的 Tips 汇总。

    3.8K40

    Mac开发跬步积累(二):NSViewController 转场动画精耕细作

    图片来自网络 与iOS相比,macOS中,控制器的转场情景相对要简洁一些,没有iOS中导航控制器的Push和Pop动画以及边缘返回手势, 保留下的Present方式,倒是提供了特有的切换方式, 可以供我们使用出许多效果...transition仅在控制器child ViewController之间进行切换....添加需要切换的控制器: RedController 和BlueController 为自定义的两个控制器,仅显示不同的视图颜色....动画效果 Summary(总结) macOS中,控制器的转场切换无论是presentViewController方式或者transition方式,本质都是将要显示的控制器视图View,通过addSubView...自定义present 动画时,需要注意事件穿透问题: 由于显示出来的控制器视图(Controller View)是通过addSubView方式添加到容器视图中,因此控制器视图(Controller

    2.7K40

    iOS开发--事件传递,响应者链条及常见面试题

    1.自己能响应触摸事件 2.触摸点在自己身上 3.从后往前递归遍历控件, 重复两步 4.如果没有符合条件的控件, 那么就自己最合适处理 3.两个重要的响应方法(UIView的) 1.hit-test...[self pointInside:point withEvent:event]){ return nil; } // 3.从后往前遍历每一个控件 for(int...CGPoint)point withEvent:(UIEvent *)event{ return NO; } 4.涉及的相关面试题 1.事件的传递方向: 事件传递是从上自下传递,响应是从下到上,所谓的就是父视图而已...如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图 2\....视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件传递给window对象进行处理 3\.

    81731

    iOS小技巧·把子视图控制器视图添加到父视图控制器

    把子视图控制器视图添加到父视图控制器并覆盖 添加控制器 #pragma mark - 添加控制器 - (void)addSubControllers{ [self addChildViewController...childViewController.view mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.view); }]; } 把子视图控制器视图添加到父视图控制器的指定容器视图...,适当时机跳转 添加控制器 #pragma mark - 添加控制器 - (void)addSubControllers { _childViewController = [[InfoViewController...alloc] initWithNibName:NSStringFromClass([InfoViewController class]) bundle:nil]; [self addChildViewController...selector(removeFromSuperview)]; [self fitFrameForChildViewController:_childViewController]; //设置默认显示容器

    95920

    iOS-控件响应用户控制事件之事件处理

    的位置 这里返回的位置是针对view的坐标系的(以view的左上角为原点(0, 0)) 调用时传入的view参数为nil的话,返回的是触摸点在UIWindow的位置 - (CGPoint)previousLocationInView...触摸点是否自己身上?...; // 2.判断下点在不在控件 if ([self pointInside:point withEvent:event] == NO) return nil; // 3....// 取出显示最前面的控件 UIView *childView = self.subviews[i]; // 转换成控件坐标系上点 CGPoint...2> 如果当前这个view不是控制器的view,那么父控件就是上一个响应者 响应者链的事件传递过程 如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图 视图层次结构的最顶级视图

    97270

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    热门标签

    领券