关于hitTest和UIResponder
来源:互联网 发布:淘宝qmini巧克力真假 编辑:程序博客网 时间:2024/06/05 10:44
关于hitTest和UIResponder
今天仔细看了一下UIView和UIResponder的介绍,着重看了一下hitTest的介绍。
首先是官方的:
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
1.我们都知道,一个屏幕事件由响应链一步步传下去。这个函数返回的view就是可以让你决定在这个point的事件,你用来接收事件的view。当然,如果这个point不在你的view的范围,返回nil。
2.这个函数忽略userInteractionEnabled,hidden,alpha<0.01,也就是你一个view隐藏或什么了,还是可以作为接收者。
3.调用次序是从subview top到bottom,包括view本身。
到底有什么用呢?这里举个例子:比如你的一个view,叫myMapView上面有一个系统MKMapView,但不想这个MKMapView允许滚动捏合等操作,所以设置它
userInteractionEnabled = NO,但是又想接收点击事件,所以你重写
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event ,这时会发现根本没有调用,而是调用了touchesCancel,因为userInteractionEnabled = NO了,所以不能算正常完成touch事件。
这时你就可以重写这个hitTest,如下:
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if( CGRectContainsPoint(mkMapView.frame ,point))
{
return mkMapView;
}
return [super hitTest:point withEvent:event];
}
这样,mkMapView仍然可以接收touchesEnded事件进行单击处理。
最后补充一下UIResponder的事件顺序,首先必须先调用hitTest判断接收事件的view,如果hitTest返回的view不为空,则会把hitTest返回的view作为第一响应者,然后调用
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
如果有UIGestureRecognizer或者userInteractionEnabled这种优先级高的,就调用
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
否则,如果中间手指移动什么的,就调用
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;(移出当前view了,就不touchesEnded了,又touchesCancelled)
最后正常完成事件,就调用-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event。
- 关于hitTest和UIResponder
- 关于 UITouch,UIEvent,UIResponder
- 事件传递和UIResponder
- HitTest 和SubItemHitTest
- pointInside和hitTest
- hitTest和pointInside方法
- UIResponder
- UIResponder
- UIResponder
- UIResponder
- UIResponder
- UIResponder
- UIResponder
- UIResponder
- UIResponder
- UIResponder
- UIResponder
- UIResponder
- Android 4.0.1 源代码编译
- 修改已存在用户的所属组(usermod用法)
- iOS 网络请求框架MKNetworkKit使用方法(欢迎提建议和分享遇到的问题)
- python中的深拷贝和浅拷贝
- Android UI系统控件进阶(二)—下拉列表控件Spinner,进度条ProgressBar,滑块控件SeekBar,评分控件RatingBar
- 关于hitTest和UIResponder
- 十一月总结
- 黑马程序员——JAVA基础之标准输入输出流
- 函数版杨辉三角
- Swift learn 8
- gluster存储改变ip段
- CF 483D - Interesting Array(TODO)
- Java判断日期是否是本日,本周,本月
- 斯坦福 机器学习Andrew NG 第三讲Logistic Regression