将UIButton和其他UIControl对象放在MKAnnotationView中并允许用户交互

时间:2011-07-28 17:10:48

标签: iphone ipad mapkit mkannotation mkannotationview

我在地图上有一个自定义注释视图,其中包含UIButton,但按下时UIButton没有响应。我在注释视图上有两个主要的用户交互问题:

  1. 按钮和其他控件无响应。
  2. 我希望注释根据- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event的实现来阻止触摸 - 也就是说,如果我返回YES,那么我不希望触摸被发送到MKMapView(可能选择其他在我的注释视图后面的注释),我想在这种情况下自己处理触摸。
  3. 我已确保将userInteractionEnabled设置为YES,并通过覆盖MKAnnotationView调查了如何将触摸发送到自定义注释视图(我的touchesBegan的子类)等等 - 但似乎触摸通常被取消(以为我已经设法获得touchesEnded几次) - 所以看起来甚至很难手动实现与自定义注释的任何用户交互图。

    是否有人对允许与MKAnnotationView个对象进行更多用户互动有任何见解?

4 个答案:

答案 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];
}