0

一天后我放弃了。我找不到解决问题的方法。

我有一张带有自定义标注视图的地图,我想检测点击以转到另一个屏幕。

看看我的代码,这是我的自定义 MKAnnotationView

- (void)didAddSubview:(UIView *)subview
{
    if ([[[subview class] description] isEqualToString:@"UICalloutView"])
    {
        for (UIView *subsubView in subview.subviews)
        {
            if ([subsubView class] == [UIImageView class])
            {
                UIImageView *imageView = ((UIImageView *)subsubView);
                [imageView removeFromSuperview];
            }
            else if ([subsubView class] == [UILabel class])
            {
                UILabel *labelView = ((UILabel *)subsubView);
                [labelView removeFromSuperview];
            }
        }
    }
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    MapAnnotation *ann = self.annotation;

    if(selected)
    {
        calloutView = [[AnnotationCalloutView alloc] initWithFrame:CGRectMake(-40, -50, 200, 30) andAnnotation:ann];        

        [self addSubview:calloutView];
        [self animateCalloutAppearance];
    }
    else
    {
        //Remove custom view
        [calloutView removeFromSuperview];
        [self setCalloutView:nil];
    }
}

结果:

自定义标注

问题就像我必须使用负 Y 位置,标注视图在注释视图之外,并且未检测到点击。我尝试了很多解决方案,但没有一个效果很好。

我目前的解决方案是在 pin superview 上直接添加一个带有手势识别器的视图,它效果很好,但是如果用户缩放我的视图就会消失。

请帮助我,否则我会自杀;)

编辑:我仍然没有找到解决方案,但是现在当我捏地图进行缩放时,我对 pin superview 的视图不再消失(我添加了一个手势识别器来拦截捏事件)。所以它可以是一个解决方案,但绝对不是一个好的解决方案。

编辑 2:在我的自定义注释视图上覆盖 hitTest 是解决方案。我现在可以检测到我的标注子视图上的点击。

4

2 回答 2

2

尝试覆盖-hitTest:withEvent:.

于 2013-03-16T02:57:38.603 回答
0

需要了解有关自定义标注的解决方案的更多信息,以了解在哪里放置识别器并聆听它们。

您是否将此解决方案用于自定义标注?

https://github.com/j4n0/callout

如果是这样,只需将 UITapGestureRecogniser 添加到 CalloutView?或者在 calloutview xib 文件的按钮上添加选择器?不知道为什么你在挣扎,你是否将这些识别器添加到正确的类中?

于 2013-03-15T19:54:51.113 回答