我在地图上有一个自定义注释视图,其中包含UIButton
,但按下时UIButton
没有响应。我在注释视图上有两个主要的用户交互问题:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
的实现来阻止触摸 - 也就是说,如果我返回YES,那么我不希望触摸被发送到MKMapView
(可能选择其他在我的注释视图后面的注释),我想在这种情况下自己处理触摸。我已确保将userInteractionEnabled
设置为YES
,并通过覆盖MKAnnotationView
调查了如何将触摸发送到自定义注释视图(我的touchesBegan
的子类)等等 - 但似乎触摸通常被取消(以为我已经设法获得touchesEnded
几次) - 所以看起来甚至很难手动实现与自定义注释的任何用户交互图。
是否有人对允许与MKAnnotationView
个对象进行更多用户互动有任何见解?
答案 0 :(得分:5)
我设法在一位同事的帮助下解决了这个问题。解决方案是覆盖- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
。我们的假设是MKAnnotationView
(你的注释视图必须继承)会覆盖它来做'错误'的事情(可能是因为注释选择不会在重叠注释之间被阻止)。所以你必须重新覆盖它来做正确的事情并返回相应的UIView
,系统然后将事件发送给它,用户将能够与它进行交互:)。这具有有益的(在这种情况下)副作用,交互式注释阻止选择其后面的注释。
答案 1 :(得分:0)
我发现,而不是覆盖hitTest:withEvent:
而不是覆盖pointInside:withEvent:
,而只是让它返回YES
。我想正式我应该做一个点 - 矩相交检查以确保我正在点击的位置在控制元素内,但在实践中,只是放return YES
看起来效果非常好,仍允许你解雇MKAnnotationView通过点击它。
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
// for testing purposes
BOOL result = [super pointInside:point withEvent:event];
NSLog(@"pointInside:RESULT = %i", result);
return YES;
}
答案 2 :(得分:0)
加上jhabbott的答案,这对我有用。我有一个自定义注释视图MKCustomAnnotationView
,它包含一个自定义注释CustomPin
作为注释。那个'pin'持有一个UIButton
作为辅助按钮替换,我想要触摸事件。
我的hitTest
方法如下所示:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView *result = [super hitTest:point withEvent:event];
//NSLog(@"ht: %f:%f %d %@", point.x, point.y, [[event touchesForView:self] count], result);
if ([result isKindOfClass:[MKCustomAnnotationView class]])
{
MKCustomAnnotationView *av = (MKCustomAnnotationView *)result;
CustomPin *p = av.annotation;
UIButton *ab = p.accessoryButton;
if (p.calloutActive && point.x >= ab.frame.origin.x)
return ab;
}
return result;
}
在大多数情况下,calloutActive
布尔可能不是必需的。
答案 3 :(得分:0)
对于想要将tapGesture添加到AnnotationView子视图的任何人,请在底部回答:
MKannotationView with UIButton as subview, button don't respond
为我工作:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if (CGRectContainsPoint(_button.frame, point)) {
return _button;
}
return [super hitTest:point withEvent:event];
}