7

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

  1. 按钮和其他控件没有响应。
  2. 我希望注释根据我的实现来阻止触摸- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event- 也就是说,如果我返回 YES,那么我不希望触摸被发送到MKMapView(可能选择在我的注释视图后面的其他注释),我想处理在这种情况下触摸自己。

我已经确定userInteractionEnabled设置为并且我已经调查了如何通过覆盖等YES方式将触摸发送到自定义注释视图(我的子类) - 但似乎触摸通常被取消(以为我已经设法获得了几次) - 所以似乎很难手动实现与自定义注释视图的任何用户交互。MKAnnotationViewtouchesBegantouchesEnded

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

4

4 回答 4

5

在同事的帮助下,我设法解决了这个问题。解决方案是覆盖- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event. 我们的假设是MKAnnotationView(您的注释视图必须继承自)覆盖它以做“错误”的事情(大概是这样注释选择不会在重叠注释之间​​被阻塞)。所以你必须重新覆盖它才能做正确的事情并返回适当UIView的,然后系统会将事件发送给它,用户将能够与之交互:)。这具有有益的(在这种情况下)副作用,即交互式注释会阻止对其后面的注释的选择。

于 2011-08-26T12:57:47.083 回答
0

我发现与其重写,不如重写hitTest:withEvent:pointInside:withEvent:然后让它返回YES。我想我应该正式进行点矩形相交检查以确保我正在点击的位置在控制元素内,但实际上,只是 putreturn 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;
}
于 2011-10-24T15:35:58.160 回答
0

加上 jhabbott 的答案,这对我有用。我有一个自定义注释视图MKCustomAnnotationView,其中包含一个自定义注释CustomPin作为注释。那个“别针”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布尔值可能不是必需的。

于 2013-04-02T12:15:27.387 回答
0

对于希望将 tapGesture 添加到 AnnotationView 子视图的任何人,然后在此底部的答案:

MKannotationView 与 UIButton 作为子视图,按钮不响应

为我工作:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    if (CGRectContainsPoint(_button.frame, point)) {
        return _button;
    }
    return [super hitTest:point withEvent:event];
}
于 2016-02-25T10:35:30.490 回答