【问题标题】:MKPointAnnotation title not showing and annotation not draggableMKPointAnnotation 标题未显示且注释不可拖动
【发布时间】:2021-03-04 14:37:16
【问题描述】:

我认为这两者是相关的,我可能在这里做错了:

首先我要覆盖 viewForAnnotation - 为了放置我的自定义图像

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    // we avoid changing the user's location blue point
    if([annotation isKindOfClass: [MKUserLocation class]]) {
      return nil;
    }
    else
    {
    static NSString *SFAnnotationIdentifier = @"SFAnnotationIdentifier";
    MKPinAnnotationView* pinAnnotationView = (MKPinAnnotationView*)[self.mapToPin dequeueReusableAnnotationViewWithIdentifier:SFAnnotationIdentifier];

     if (!pinAnnotationView)
          {
              MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation
                                                                 reuseIdentifier:SFAnnotationIdentifier];
                  UIImage *littleImage = [UIImage imageNamed:@"littleImage.png"];
                  // You may need to resize the image here.
                  annotationView.image = littleImage;
              
                  pinAnnotationView.draggable = true;
                  pinAnnotationView.canShowCallout = true;
                  pinAnnotationView.animatesDrop = true;
                  return annotationView;
          }
          else
          {
              pinAnnotationView.annotation = annotation;
          }
          return pinAnnotationView;
    }
    

}

pinAnnotationView 的 draggablecanShowCalloutanimatesDrop 似乎不起作用。

然后,我在 viewDidLoad 中调用我的方法来设置注释

-(void) setAnnotation:(NSString*)lat : (NSString*)lng
{
    _mapAnnotation = [[MKPointAnnotation alloc] init];
    CLLocationCoordinate2D coordinateForPin;
    coordinateForPin.latitude = [lat floatValue];
    coordinateForPin.longitude = [lng floatValue];
    [_mapAnnotation setCoordinate:coordinateForPin];
    [_mapAnnotation setTitle:@"sometitle"];
    [_mapToPin addAnnotation:_mapAnnotation];
}

似乎 [_mapAnnotation setTitle:@"sometitle"];当我覆盖 viewForAnnotation 时不再工作。

这是正确的方法吗?我一直在浏览,但没有找到任何可以提供帮助的解决方案。任何反馈将不胜感激。

【问题讨论】:

    标签: ios mkannotationview mobile-development mkpinannotationview mkpointannotation


    【解决方案1】:

    问题是意外引用了错误的变量名。 pinAnnotationViewif 语句中是 nil,因此使用 nil 引用设置属性是 NOOP。

    
    if (!pinAnnotationView) {
        MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation
                                                                        reuseIdentifier:SFAnnotationIdentifier];
    
        ...
    
        annotationView.draggable = true;      // not pinAnnotationView
        annotationView.canShowCallout = true;
        annotationView.animatesDrop = true;
    
        return annotationView;
    }
    

    FWIW,如果面向 iOS 10 或更高版本,您可以注册自己的类并将注释视图配置代码移动到该子类中。此外,在 iOS 11 及更高版本中,您根本不需要 mapView:viewForAnnotation:

    例如,在 iOS 11 及更高版本中:

    //  MyAnnotationView.h
    
    @import MapKit;
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface MyAnnotationView : MKPinAnnotationView
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    //  MyAnnotationView.m
    
    #import "MyAnnotationView.h"
    
    @implementation MyAnnotationView
    
    - (instancetype)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
        self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
    
        if (self) {
            ...
    
            self.draggable = true;
            self.canShowCallout = true;
            self.animatesDrop = true;
        }
    
        return self;
    }
    
    @end
    

    然后,在你的viewDidLoad 中注册这个类。

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        [self.mapView registerClass:[MyAnnotationView class] forAnnotationViewWithReuseIdentifier:MKMapViewDefaultAnnotationViewReuseIdentifier];
        ...
    }
    

    然后您可以完全删除 mapView:viewForAnnotation: 实现。

    【讨论】:

    • 谢谢 Rob,这很有帮助,但也许我遗漏了一些东西,我已经完成了所有步骤,它现在可以拖动了,但我的图像不再显示 - 回到默认行为.除了你提到的那个,我没有做任何其他的改变。我应该用我的 setAnnotation() 方法(上面提到的)改变任何东西还是使用不同于 MKPointAnnotation 的东西?
    • @TheGix - MKPinAnnotationView 旨在显示引脚。它曾经允许图像,但他们在几个 iOS 版本前改变了这一点。如果你想使用你的自定义图像,那么不要继承MKPinAnnotationView,而只是MKAnnotationView。 (我没有注意到,当您将变量称为“引脚注释”时,实际上是在实例化 MKAnnotationView,而不是 MKPinAnnotationView。)仅供参考,MKAnnotationView 没有 animatesDrop 属性。
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2012-08-09
    相关资源
    最近更新 更多