2010-11-16 49 views
11

看来,只有触摸开始于该视图范围内时才会调用UIView的所有触摸方法。有没有办法让视图响应已触及视图外的用户,但将手指拖入视图?UIView,如何确定触摸什么时候进入视图

万一它很重要,我的具体应用是拖动MKPinAnnotationView(使用内置4.0拖动)。如果用户将一个pin拖动到另一个视图(这恰好也是AnnotationView,但它可能是任何东西),我希望发生一些事情。直到我松开销钉,才会调用拖动方法;并没有方法没有UIView被拖到似乎被调用,除非我开始在视图内触摸。

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

+0

@Joe - MKMapView的子类没有收到TouchesBegan或TouchesMoved ...我猜是因为它需要做它自己的东西来滚动和缩放?这个问题在这里概述:http://stackoverflow.com/questions/1049889/how-to-intercept-touches-events-on-a-mkmapview-or-uiwebview-objects – GendoIkari 2010-11-17 22:11:00

回答

3

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

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

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

0

每个视图都继承了UIResponder,所以每个视图都有touchesBegan/Moved/Ended - 我不认为在视图之外开始触摸意味着当触摸移到视图上时视图不会获得任何事件。如果你想得到一个通知,说明有东西被拖到你的MKMapView上,你应该创建一个处理触摸的子类,然后把事件传递给super,这样层次结构就可以做任何它需要的触摸操作。你不需要捕捉或修改事件只是观察它。

+0

我已经证实了一个简单的测试视图,触摸在视图之外并将手指拖入它不会导致touchesBegan或touchesMoved被调用。 – GendoIkari 2010-11-17 15:58:40

1

你肯定可以:

(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的子视图。

+1

似乎只有当用户第一次按下按钮时才会调用hitTest;它不会在用户移动/拖动时调用。 – GendoIkari 2010-11-17 16:04:23

0

这取决于您的视图如何设置。一般来说,利用响应者链是最好的选择。它允许你玩技巧,虽然它可能太具体以至于不能满足你的特殊需求。

您也可以玩小聪明与覆盖着事件的点击测试:

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

你的具体情况听起来相当特殊的,所以你可能要玩花招就像它的框架是足够大,父视图包含有问题的两个视图。

相关问题