手机建个人网站免费word模板
web/
2025/10/1 22:21:36/
文章来源:
手机建个人网站,免费word模板,企业网站关键词排名 s,wordpress 网站重置Hittest 机制原理
hitTest的原理就是#xff0c;当我们点击的时候#xff0c;会触发 window的 hittest方法#xff0c;在该方法中会首先使用point inside方法判断 点击的地方是否在window范围内#xff0c;如果在的话#xff0c;就倒序遍历姿子视图#xff0c;然后将poi…Hittest 机制原理
hitTest的原理就是当我们点击的时候会触发 window的 hittest方法在该方法中会首先使用point inside方法判断 点击的地方是否在window范围内如果在的话就倒序遍历姿子视图然后将point转换为相对于子视图的point然后在子视图再执行hittest,里面执行同样的流程。如果不在window范围内的话就返回一个nil 这里写下实现逻辑
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{if (self.hidden NO || self.alpha 0.05 || self.userInteractionEnabled NO) {//1.当满足这几个条件时直接丢弃touch事件不再向下分发。return nil;}else{if (![self pointInside:point withEvent:event]) {//2.如果点击point在视图之外丢弃return nil;}else{//3.分发给子视图if (self.subviews.count 0) {for (UIView *subView in self.subviews) {UIView *hitTestSubView [subView hitTest:point withEvent:event];return hitTestSubView;}}else{return self;}}}
}
实际应用
扩大点击范围
重写 hitTest 方法通过UIEdgeInsetsInsetRect 方法生成一个新的frame然后判断point是否在rect里面
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{CGRect rect UIEdgeInsetsInsetRect(self.bounds, self.expandEdgeInset);if (CGRectContainsPoint(rect, point)) {return self;}return [super hitTest:point withEvent:event];
}
子视图超出父视图可点击
重写 hitTest 方法 在里面不执行 point inside方法系统默认是要执行的因为要判断点击的点是否在自己范围内
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{CGPoint pointInSubbutton [self convertPoint:point toView:self.subButton];if ([self.subButton hitTest:pointInSubbutton withEvent:event]) {return [self.subButton hitTest:pointInSubbutton withEvent:event];}return [super hitTest:point withEvent:event];
}
其实从上面的逻辑来看不管我们是扩大点击范围还是子视图超出范围可以点击 都是去掉了系统hitest方法中的point inside 方法
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85283.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!