11

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

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

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

4

4 回答 4

3

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

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

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

于 2010-11-18T15:27:47.580 回答
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 的子视图。

于 2010-11-17T00:02:11.093 回答
0

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

于 2010-11-16T23:56:57.293 回答
0

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

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

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

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

于 2010-11-17T08:56:13.490 回答