地图大头针气泡点击事件
项目中需要实现点击地图中大头针点击后出现气泡的点击事件,使用系统的方法一直没办法实现,最后发现一个很取巧的方案去解决了这个问题.
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{
// If the annotation is the user location, just return nil.(如果是显示用户位置的Annotation,则使用默认的蓝色圆点)
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
if ([annotation isKindOfClass:[MKPointAnnotation class]]) {
// Try to dequeue an existing pin view first.(这里跟UITableView的重用差不多)
MKAnnotationView *customPinView = (MKAnnotationView*)[mapView
dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"];
if (!customPinView){
// If an existing pin view was not available, create one.
customPinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CustomPinAnnotationView"];
}
//大头针的图标改变
customPinView.image = [UIImage imageNamed:@"myimage"];
//是否允许插入气泡
customPinView.canShowCallout = YES;
//实现气泡点击需要设置右侧的点击详情按钮,但是需要将创建的button类型设置为除默认类型如UIButtonTypeInfoLight,核心代码
UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
rightButton.frame = CGRectMake(0, 0, 2, 2);
customPinView.rightCalloutAccessoryView = rightButton;
customPinView.rightCalloutAccessoryView.backgroundColor = [UIColor whiteColor];
return customPinView;
}
return nil;//返回nil代表使用默认样式
}
//气泡的点击事件
-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control{
NSLog(@"点击了查看详情");
}
核心就是将rightCalloutAccessoryView设置的button创建类型修改为除了默认类型的其他类型.但是此处还有一个问题不能实现传值.通过运行时创建MKAnnotationView的分类动态添加属性解决传值的问题.当然也可以采用自定义气泡解决问题.