按钮在自定义标注中不起作用

时间:2014-01-03 19:20:08

标签: ios objective-c cocoa-touch

所以我试过这个 -

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view{
    [self.mapAnnotationViewController.view removeFromSuperview];
    MyLocation* location = (MyLocation*)view.annotation;
    currentResultDictionary = [location cardJson];
    [self.mapAnnotationViewController setAnnotationTitle: [location title]];
    [self.mapAnnotationViewController setRating:3.0];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    UIImage* forwardButtonImage = [UIImage imageNamed:@"forward-50x50.png"];
    button.frame = CGRectMake(141,5,25,25);
    [button setBackgroundImage:forwardButtonImage forState:UIControlStateNormal];
    [button addTarget:self action:@selector(displayCard:) forControlEvents:UIControlEventTouchUpInside];

    //Since we are re-using the callout view,
    //may need to do additional "cleanup" so that the callout
    //shows the new annotation's data.

    [view addSubview:self.mapAnnotationViewController.view];
    [view addSubview: button];
}

-(IBAction)displayCard:(id)sender{
    NSLog(@"DISPLAY CARD CALLED");
}

这会成功添加按钮,但是当我点击它时,不会调用displayCard方法。为什么会这样?

所以这可能就是为什么它不起作用 -

How To add custom View in map's Annotation's Callout's

但是,该解决方案是视图的子类 - 我只能访问控制器。我可以通过该解决方案减少我的问题吗?

1 个答案:

答案 0 :(得分:3)

根据您之前的问题,此处的问题是按钮的框架位于图钉注释视图的框架之外。因此,触摸按钮不会做任何事情。

假设您仍在使用默认的MKPinAnnotationView,则默认视图大小约为32 x 32.由于该按钮在x坐标为141时作为子视图添加到其中,因此它位于父视图的外部框架和触摸不起作用。

一个解决方案(虽然它会导致其他问题)是修改MKPinAnnotationView的框架,以便包含按钮。所以在viewForAnnotation中,在创建视图之后,您可以放置​​:

pav = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pin"];
pav.canShowCallout = NO;
//increase the frame size to include the button...
pav.frame = CGRectMake(0, 0, 200, 40);
//adjust contentMode otherwise default pin image will be distorted...
pav.contentMode = UIViewContentModeTopLeft;

我不推荐上述内容。这可能有效,但可能会导致其他问题。


更好的解决方案可能是将自定义标注视图添加到注释视图,而不是添加到主视图控制器的视图。这样,您就不需要弄乱注释视图了。您需要将所选引脚的coordinate转换为主视图中的相应CGPoint,并将自定义标注视图的origin设置为该点。在didSelectAnnotationView

[self.mapAnnotationViewController.view removeFromSuperview];

CGRect mavcFrame = mapAnnotationViewController.view.frame;
CGPoint p = [mapView convertCoordinate:view.annotation.coordinate toPointToView:self.view];
//You may need/want to adjust p after the conversion depending on where 
//you want the callout view to appear relative to the annotation.
mavcFrame.origin = p;
mapAnnotationViewController.view.frame = mavcFrame;

//add subview to self.view instead of view...
[self.view addSubview:self.mapAnnotationViewController.view];

此外,我不建议在didSelectAnnotationView中添加按钮,因为您最终会在每次选择注释时都不会删除重复的按钮。

相反,在创建mapAnnotationViewController.view后立即创建按钮并将 mapAnnotationViewController 添加到 {{1}}