时间:2021-05-20
iOS事件链有两条:事件的响应链;Hit-Testing事件的传递链
在iOS中只有继承UIResponder的对象才能够接收并处理事件,UIResponder是所有响应对象的基类,在UIResponder类中定义了处理上述各种事件的接口。我们熟悉的UIApplication、UIViewController、UIWindow和所有继承自UIView的UIKit类都直接或间接的继承自UIResponder,所以它们的实例都是可以构成响应者链的响应者对象,首先我们通过一张图来简单了解一下事件的传递以及响应
1.传递链
事件传递的两个核心方法
- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event; // recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event; // default returns YES if point is in bounds第一个方法返回的是一个UIView,是用来寻找最终哪一个视图来响应这个事件
第二个方法是用来判断某一个点击的位置是否在视图范围内,如果在就返回YES
其中UIView不接受事件处理的情况有
1. alpha <0.012. userInteractionEnabled = NO3. hidden = YES事件传递的流程图
流程描述
2.响应链
响应者链流程图
响应者链的事件传递过程总结如下
实例场景
在一个方形按钮中点击中间的圆形区域有效,而点击四角无效
核心思想是在pointInside: withEvent:方法中修改对应的区域
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { // 如果控件不允许与用用户交互,那么返回nil if (!self.userInteractionEnabled || [self isHidden] || self.alpha <= 0.01) { return nil; } //判断当前视图是否在点击范围内 if ([self pointInside:point withEvent:event]) { //遍历当前对象的子视图(倒序) __block UIView *hit = nil; [self.subviews enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { //坐标转换,把当前坐标系上的点转换成子控件坐标系上的点 CGPoint convertPoint = [self convertPoint:point toView:obj]; //调用子视图的hitTest方法,判断自己的子控件是不是最适合的View hit = [obj hitTest:convertPoint withEvent:event]; //如果找到了就停止遍历 if (hit) *stop = YES; }]; //返回当前的视图对象 return hit?hit:self; }else { return nil; }}// 该方法判断触摸点是否在控件身上,是则返回YES,否则返回NO,point参数必须是方法调用者的坐标系- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { CGFloat x1 = point.x; CGFloat y1 = point.y; CGFloat x2 = self.frame.size.width / 2; CGFloat y2 = self.frame.size.height / 2; //判断是否在圆形区域内 double dis = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); if (dis <= self.frame.size.width / 2) { return YES; } else{ return NO; }}总结
以上所述是小编给大家介绍的iOS 中事件的响应链和传递链,希望对大家有所帮助!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
UIEvent是一系列UITouch的集合,在IOS中负责响应触摸事件。另外还提到了响应者链的概念,在IOS中,所有事件有一个最先响应者,事件可以沿着响应者链向
本节引言前两节中我们对Android中的两种事件处理机制进行了学习,关于响应的事件响应就这两种;本节给大家讲解的是Activity中UI组件中的信息传递Hand
SEO内链这样优化才有用!站内优化是SEO优化中重要的一环,其中内链的布局和优化是各个页面之间相互传递的关键,一个布局优良的内链页面可以吸引蜘蛛在你的网站内
SEO中流传甚广的一句话是“外链为王,内容为王”,说明了站内外网站优化的重要性。外链优化实际上是外链的构建。在我们网站的优化过程中,为了方便重量和流量的传递,我
内链是整个网站的脉络,在过程中,它的作用不可忽视的。内链的布局直接影响到网站的收录、以及网站跳出率等等。首页内链布局好能带动内页长尾,而内页的内链布局好能传递权