【问题标题】:UIView, how to determine when touches entered the viewUIView,如何确定触摸何时进入视图
【发布时间】:2011-05-11 03:20:15
【问题描述】:

似乎 UIView 的所有触摸方法仅在触摸开始于该视图的范围内时才会被调用。有没有办法让视图响应在视图外触摸但随后将手指拖入视图的用户?

如果它很重要,我的特定应用程序是用于拖动 MKPinAnnotationView(使用内置的 4.0 拖动)。如果用户将图钉拖到另一个视图上(恰好也是 AnnotationView,但它可以是任何东西),我希望发生一些事情。在我松开别针之前,不会调用任何拖动方法;除非我从视图中触摸开始,否则似乎不会调用被拖动到的 UIView 的任何方法。

因为 superview 是一个 MKMapView,很难只使用它的 touchesMoved 事件并检查用户是否在正确的位置。谢谢!

【问题讨论】:

  • @Joe - MKMapView 的子类不接收 TouchesBegan 或 TouchesMoved ......我猜是因为它需要自己做滚动和缩放的工作?此处概述了该问题:stackoverflow.com/questions/1049889/…

标签: iphone objective-c mkmapview touches


【解决方案1】:

所以在玩了一段时间之后,我发现here 给出的答案实际上给了我我需要的东西,即使被问到的问题不同。

事实证明你可以继承 UIGestureRecognizer;并让它处理已添加到的视图的所有触摸(包括 MKMapView)。这允许所有正常的 MKMapView 交互仍然没有任何问题;但也提醒我触摸。在 touchesMoved 中,我只检查触摸的位置;看看它是否在我的另一个视图的范围内。

从我尝试过的一切中;这似乎是在用户拖动 MKAnnotation 时拦截 touchesMoved 的唯一方法。

【讨论】:

    【解决方案2】:

    这取决于您的视图是如何设置的。通常利用响应者链是最好的方法。它允许您玩花样,尽管它可能过于具体,无法满足您的特定需求。

    您还可以通过覆盖命中测试来玩弄转发事件:

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

    您的特殊情况听起来很奇特,因此您可能不得不玩一些技巧,例如拥有一个父视图,其框架足够大以包含所讨论的两个视图。

    【讨论】:

      【解决方案3】:

      你当然可以:

      (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 设置为您想要触摸的视图。 IIRC 它应该是 HitstateView 的子视图。

      【讨论】:

      • 似乎只有在用户第一次按下按钮时才会调用hitTest;它不会在用户移动/拖动时被调用。
      【解决方案4】:

      每个视图都继承UIResponder,因此每个视图都会被touchesBegan/Moved/Ended - 我不认为在视图外开始触摸意味着当触摸在视图上移动时视图不会收到任何事件。如果你想得到一个通知,告诉你一些东西已经被拖到你的 MKMapView 上,你应该创建一个处理触摸的子类,然后将事件传递给super,允许层次结构做任何需要触摸的事情。您无需捕获或修改事件,只需观察它即可。

      【讨论】:

      • 我已经通过一个简单的测试视图确认,触摸视图外部并将手指拖入其中不会导致调用 touchesBegan 或 touchesMoved。
      猜你喜欢
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多