zoukankan      html  css  js  c++  java
  • 关于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

    {

        ifCGRectContainsPoint(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。

     

     

  • 相关阅读:
    如何评测一个软件工程师的计算机网络知识水平与网络编程技能水平?
    如何评测软件工程知识技能水平
    深入理解TCP协议及其源代码
    Socket与系统调用深度分析
    创新产品的需求分析:未来的图书会是什么样子?
    构建调试Linux内核网络代码的环境MenuOS系统
    Java实现简单网络聊天程序
    适配器模式的探究
    Linux下ss命令的研究
    业务领域建模Domain Modeling
  • 原文地址:https://www.cnblogs.com/vicstudio/p/3133359.html
Copyright © 2011-2022 走看看