代码之家  ›  专栏  ›  技术社区  ›  GendoIkari

UIView,如何确定触摸何时进入视图

  •  11
  • GendoIkari  · 技术社区  · 14 年前

    似乎只有当一个UIView的触摸开始于该视图的范围内时,才会调用该视图的所有触摸方法。有没有一种方法可以让视图对触摸到视图外部但又将手指拖到视图中的用户做出响应?

    如果重要的话,我的特定应用程序用于拖动MKPinAnnotationView(使用内置的4.0拖动)。我希望如果用户将一个pin拖到另一个视图上(这也恰好是一个注释视图,但它可以是任何东西),就会发生一些事情。在我松开管脚之前,不会调用任何拖动方法;除非我从视图内部开始触摸,否则不会调用正在拖动的UIView。

    因为superview是MKMapView,所以很难只使用该视图的touchesMoved事件并检查用户是否位于正确的位置。谢谢!

    4 回复  |  直到 14 年前
        1
  •  3
  •   Community Reversed Engineer    7 年前

    所以在玩了一会儿之后,我发现 here 实际上给了我所需要的,尽管被问的问题不同。

    事实证明,您可以将UIGestureRecognizer子类化,并让它处理添加到视图(包括MKMapView)的所有接触。这允许所有正常的mkmappview交互仍然正常运行,没有任何问题;但也提醒我触摸。在touchesMoved中,我只需检查触摸的位置,看看它是否在其他视图的范围内。

    从我所尝试的一切来看,这似乎是在用户拖动MKAnnotation时拦截touchesMoved的唯一方法。

        2
  •  1
  •   v01d    14 年前

    你当然可以:

    (HitstateView.h)

    #import <UIKit/UIKit.h>
    
    
    @interface HitstateView : UIView {
        id overrideObject;
    }
    
    @property (nonatomic, retain) id overrideObject;
    
    @end
    

    (HitstateView.m)

    #import "HitstateView.h"
    
    
    @implementation HitstateView
    
    @synthesize overrideObject;
    
    - (void)dealloc {
        self.overrideObject = nil;
    
        [super dealloc];
    }
    
    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
        UIView *hitView = [super hitTest:point withEvent:event];
        if (hitView == self) {
            return overrideObject;
        }
        return hitView;
    }
    
    @end
    

    将此视图设置为触摸区域的大小。将overideObject设置为要进行触摸的视图。它应该是HitstateView的一个子视图。

        3
  •  0
  •   Adam Eberbach Adil Shaikh    14 年前

    每个视图都继承 UIResponder 所以每个视图都会得到touchesStarted/Moved/End——我不认为在视图外部开始触摸意味着当触摸在视图上移动时视图不会得到任何事件。如果您想得到一个关于某个东西被拖到mkmappview上的通知,您应该创建一个处理触摸的子类,然后将事件传递给 super ,允许层次结构对触摸执行所需的任何操作。您不需要捕获或修改事件,只需观察它。

        4
  •  0
  •   walter    14 年前

    这取决于你的观点是如何建立的。一般来说,利用响应链是最好的方法。它允许你玩把戏,尽管它可能太具体,无法满足你的特殊需要。

    您还可以通过覆盖命中测试对转发事件进行戏法:

    http://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.html%23//apple_ref/doc/uid/TP40009541-CH3-SW3

    你的特殊情况听起来很奇怪,所以你可能不得不玩一些小把戏,比如有一个父视图,它的框架足够大,可以包含两个有问题的视图。