我正在使用当前位置图标的自定义调出(标题和副标题)。我尝试按下以禁用默认注释,但它不起作用。
- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation
{
NSLog(@"viewForAnnotation");
if ([annotation isKindOfClass:[MKUserLocation class]])
{
MKAnnotationView *userLocationView = [mapView viewForAnnotation:annotation];
userLocationView.canShowCallout = NO;
NSLog(@"[annotation isKindOfClass:[MKUserLocation class]");
return nil;
}
}
唯一有效的方法是
-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)ann
{
if([ann.annotation isKindOfClass:[MKUserLocation class]] )
{
[mymap deselectAnnotation:ann.annotation animated:NO];
}
}
但它有时会滞后。是否有其他方法可以禁用当前位置注释的默认标注视图?任何帮助将不胜感激。
答案 0 :(得分:28)
要完成此操作,需要获取当前位置MKAnnotationView
的参考。可以在任何地方获得此引用,但最好在确定用户位置后立即获取该引用。
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
MKAnnotationView* annotationView = [mapView viewForAnnotation:userLocation];
annotationView.canShowCallout = NO;
}
或使用以下方法
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
MKAnnotationView *aV;
for (aV in views) {
if ([aV.annotation isKindOfClass:[MKUserLocation class]]) {
MKAnnotationView* annotationView = aV;
annotationView.canShowCallout = NO;
}
}
如果想在运行时更改canShowCallout属性,那么可以使用以下
for (AnnotationClass* annotation in mapView.annotations)
{
if([annotation isKindOfClass:[MKUserLocation class]] )
{
MKAnnotationView* annotationView = [mapView viewForAnnotation:annotation];
annotationView.canShowCallout = NO;
}
}
答案 1 :(得分:6)
使用swift进行更新(基于chatur的回答):
func mapView(mapView: MKMapView!, didAddAnnotationViews views: [MKAnnotationView]!) {
for view in views {
if view.annotation.isKindOfClass(MKUserLocation) {
view.canShowCallout = false
}
}
}
注意:使用此功能,我不需要任何其他功能即可使其正常工作
答案 2 :(得分:2)
夫特:
这对我有用:只需添加此委托方法。
func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) {
for var view in views {
view.canShowCallout = false
}
}
答案 3 :(得分:1)
这适用于Swift 3.0 / iOS 10。
func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) {
(views.filter { $0.isKind(of: MKUserLocation.self) }).first?.canShowCallout = false
}
我不是循环遍历所有视图,而是依赖filter
命令,然后首先执行可选调用,因为应该只有一个位置,然后将值设置为false。
答案 4 :(得分:1)
// Objective-C
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
MKAnnotationView *userLocationView = [mapView viewForAnnotation:userLocation];
userLocationView.canShowCallout = NO;
}
// Swift 4.2
func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
let userAnnotationView = mapView.view(for: userLocation)
userAnnotationView?.canShowCallout = false
}
答案 5 :(得分:0)
修改强>
抱歉让你错了。
我对此大打折扣。
这是我成功的唯一方法。此方法的问题是您必须更改UserLocation视图。所以它可能不是那么用户友好。
任何方式:
- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{
if ([annotation isKindOfClass:[MKUserLocation class]]){
MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
annotationView.image = [UIImage imageNamed:@"your-icon.png"];
annotationView.enabled=NO;
return annotationView;
};
........}
必须跑到幼儿园带我的孩子:)
祝你好运