似乎只有触摸在该视图的边界内开始时才会调用UIView的所有触摸方法。有没有办法让视图响应在视图外触摸但随后将手指拖入视图的用户?
如果重要,我的具体应用是拖动MKPinAnnotationView(使用内置的4.0拖动)。如果用户将一个引脚拖动到另一个视图(这恰好是一个AnnotationView,但它可能是任何东西),我想要发生一些事情。在我放开引脚之前,没有调用拖动的方法;除非我从视图中触摸开始,否则没有方法没有被拖动的UIView似乎被调用。
因为superview是一个MKMapView,所以很难只使用touchesMoved事件并检查用户是否在正确的位置。谢谢!
答案 0 :(得分:3)
所以在玩了一段时间之后,我发现here给出的答案实际上给了我所需要的答案,即使提出的问题不同。
事实证明你可以继承UIGestureRecognizer;并让它处理已添加到的视图的所有触摸(包括MKMapView)。这允许所有正常的MKMapView交互仍然没有任何问题;但也提醒我接触。在touchesMoved中,我只是检查触摸的位置;并查看它是否在我的其他观点的范围内。
从我尝试的一切;这似乎是用户拖动MKAnnotation时拦截touchesMoved的唯一方法。
答案 1 :(得分: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的子视图。
答案 2 :(得分:0)
每个视图都会继承UIResponder
,因此每个视图都会触摸开始/移动/结束 - 我不认为在视图外部开始触摸意味着当触摸在视图上移动时视图不会发生任何事件。如果您想要通知某些内容已被拖动到您的MKMapView上,您应该创建一个处理触摸的子类,然后将该事件传递给super
,从而允许层次结构执行触摸所需的任何操作。您只需观察它就不需要捕获或修改事件。
答案 3 :(得分:0)
这取决于您的观看次数的设置方式。通常利用响应者链是最好的方法。它允许你玩弄技巧,虽然它可能太具体,无法满足你的特殊需求。
您还可以通过覆盖命中测试来播放前进事件的技巧:
你的特殊情况听起来很奇特,所以你可能不得不玩一些技巧,比如父视图的框架大到足以包含两个有问题的视图。