所以我试过这个 -
-(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
但是,该解决方案是视图的子类 - 我只能访问控制器。我可以通过该解决方案减少我的问题吗?
答案 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}} 。