首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法向自定义的calloutView添加点击手势

无法向自定义的calloutView添加点击手势
EN

Stack Overflow用户
提问于 2014-06-12 13:16:39
回答 2查看 370关注 0票数 1

我的应用程序中有一个地图视图,它需要为每个地图注释定制calloutView。因此,我为这个定制的calloutView提供了一个XIB文件。这是我的地图视图控制器的代码

代码语言:javascript
复制
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {
    CustomCalloutView *calloutView = (CustomCalloutView *)[[[NSBundle mainBundle] loadNibNamed:@"CustomCalloutView" owner:self options:nil] objectAtIndex:0];
    [calloutView.layer setCornerRadius:10];
    CGRect calloutViewFrame = calloutView.frame;
    calloutViewFrame.origin = CGPointMake(-calloutViewFrame.size.width/2 + 15, -calloutViewFrame.size.height);
    calloutView.frame = calloutViewFrame;

    // some other code such as load images for calloutView

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap)];
    singleTap.numberOfTapsRequired = 1;
    [calloutView addGestureRecognizer:singleTap];
    [view addSubview:calloutView];
}

- (void)handleSingleTap{
    NSLog(@"it works");
}

但是,handleSingleTap:从未被调用过。相反,calloutView上的每一个点击都只会简单地忽略calloutView。我还试图在calloutView上添加一个按钮,但是点击它也会导致calloutView被取消,而不是调用按钮操作。

有人能帮忙吗?

更新

我试着修改代码

代码语言:javascript
复制
    [view addSubview:calloutView];

代码语言:javascript
复制
    [self.view addSubview:calloutView];

它将自定义的calloutView添加到主容器视图中,而不是mapView。

然后,它可以很好的拍打手势。因此,我认为问题应该是由mapView引起的,似乎mapView将calloutView上的所有触摸事件都传递给了自己。有人对此有想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-18 02:43:52

好的。我终于想出了解决办法。我们需要为MKAnnotationView定制一个类来解决这个问题。以下是.m文件中的代码

代码语言:javascript
复制
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
    UIView* hitView = [super hitTest:point withEvent:event];
    if (hitView != nil)
    {
        [self.superview bringSubviewToFront:self];
    }
    return hitView;
}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
{
    CGRect rect = self.bounds;
    BOOL isInside = CGRectContainsPoint(rect, point);
    if(!isInside)
    {
        for (UIView *view in self.subviews)
        {
            isInside = CGRectContainsPoint(view.frame, point);
            if(isInside)
                break;
        }
    }
    return isInside;
}

希望这能对其他人有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2014-06-12 14:33:54

您需要修改您的tap手势实现&方法called.Have查看并检查它是否工作。

代码语言:javascript
复制
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap)];
singleTap.numberOfTapsRequired = 1;
[calloutView addGestureRecognizer:singleTap];
[view addSubview:calloutView];


- (void)handleSingleTap:(UIGestureRecognizer *)recognizer {
    NSLog(@"it works");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24185424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档