IOS CustomCallout不会从视图

时间:2017-04-29 15:10:02

标签: ios objective-c

我有一个从xib文件加载的自定义callout。 它正确加载和显示。 问题是标注不会从视图中删除。 我最近添加了'tag = 999',所以我可以尝试跟踪子视图,没有快乐,它永远不会看到值为999的标记。

我已经尝试了所有可能的“removeFromSuperview”组合。 'handleTap方法被称为ok。

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView 
*)view {

    if ([view.annotation isKindOfClass:[MKUserLocation class]]) {
        return;
    }
    UIView *customCalloutView = [[[NSBundle mainBundle] loadNibNamed:@"CustomXibCallout" owner:self options:nil]objectAtIndex:0];
    customCalloutView.tag = 999;
    customCalloutView.backgroundColor = [UIColor whiteColor];
    customCalloutView.alpha = 0.9;
    customCalloutView.layer.cornerRadius = 10.0f;
    CGPoint offset = CGPointAdd(customCalloutView.center,(CGPointMake(-100, -150)));
    customCalloutView.center = offset;
    [view addSubview: customCalloutView];
}


- (void)handleTap:(UITapGestureRecognizer *)sender {
    if (sender.state == UIGestureRecognizerStateEnded) {
        for (UIView *subView in self.view.subviews) {
            if (subView.tag == 999) {
                [subView removeFromSuperview];
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

- (void)handleTap:(UITapGestureRecognizer *)sender
{
if (sender.state == UIGestureRecognizerStateEnded)
{
    MKAnnotationView *av = (MKAnnotationView *)sender.view;
        if (av.tag == 999) {
            [av removeFromSuperview];
        }
    }
}

答案 1 :(得分:0)

首先,您要将customCalloutView添加为MKAnnotationView - 的子视图作为self.view的子视图。所以循环self.view.subviews寻找999并不会起作用。

具体取决于层次结构...如果(MKAnnotationView *)view(MKMapView *)mapView的子视图,这是self.view的子视图...您可以尝试:

    UIView *v = [self.view viewWithTag:999];
    [v removeFromSuperview];

但....我认为更好的方法是知道视图在层次结构中的位置。在- (void)handleTap:(UITapGestureRecognizer *)sender中,sender是手势。你可以通过以下方式获得发送水龙头的视图:

    sender.view

因此,如果您知道MKAnnotationView正在发送手势,您可以继续分配999代码并将处理程序更改为:

    - (void)handleTap:(UITapGestureRecognizer *)sender {
        if (sender.state == UIGestureRecognizerStateEnded) {
            UIView *v = [sender.view viewWithTag:999];
            [v removeFromSuperview];
        }
    }