为啥我的 MKPointAnnotation 不是自定义的?

Posted

技术标签:

【中文标题】为啥我的 MKPointAnnotation 不是自定义的?【英文标题】:Why is my MKPointAnnotation not Custom?为什么我的 MKPointAnnotation 不是自定义的? 【发布时间】:2013-05-12 12:05:01 【问题描述】:

我的 MKPointAnnotation 应该使用此代码是自定义的:

-(MKPointAnnotation*)setAnnotation: (NSString*) title atLocation:(CLLocationCoordinate2D)Location withImage:(UIImage*) LocationImage
    Pin = [[MKPointAnnotation alloc] init];
    Pin.title = title;
    [Pin setCoordinate:Location];
    [self mapView:mapView viewForAnnotation:Pin].annotation = Pin;
    return Pin;




-(MKAnnotationView *)mapView: (MKMapView *)mapView viewForAnnotation: (id<MKAnnotation>) annotation

        MKPinAnnotationView* pinView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"];


        if(!pinView)
            pinView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"CustomPinAnnotationView"];
            pinView.animatesDrop = YES;
            pinView.canShowCallout = YES;
            pinView.enabled = YES;
            UIButton *PicButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
            [PicButton addTarget:self action:@selector(showLocationPicture) forControlEvents:UIControlEventTouchUpInside];\
            pinView.rightCalloutAccessoryView = PicButton;
        
        else
            pinView.annotation = annotation;
        
    return pinView;

然而,由于某种原因,Pin 仍然是默认的,有人可以帮我吗? 谢谢

【问题讨论】:

【参考方案1】:

你不应该自己打电话给viewForAnnotation。您应该只向地图视图添加注释,然后它将确定在任何给定时刻可见的内容并为您调用viewForAnnotation。因此:

鉴于不同的注释可以有不同的图像,你真的想继承MKPointAnnotation 并给它一个imageName 的属性(注意,不是UIImage 本身,而是viewForAnnotation 的名称或标识符可以用来创建UIImage 本身):

@interface MyAnnotation : MKPointAnnotation
@property(nonatomic, strong) NSString *imageName;
@end

@implementation MyAnnotation
@end

向您的地图视图添加注释(不是注释视图),例如:

- (id<annotation>)addAnnotationWithTitle:(NSString *)title coordinate:(CLLocationCoordinate2D)coordinate imageName:(NSString *)imageName

    MyAnnotation *annotation = [[MyAnnotation alloc] init];
    annotation.title = title;
    annotation.coordinate = coordinate;
    annotation.imageName = imageName;
    [mapView addAnnotation:annotation];
    return annotation;

注意,我不建议将 Pin 设为类 ivar/property,并且我会使用 camelCase 作为变量名(以小写开头),我会将方法名称从 setAnnotation 更改为类似 @ 987654333@等

确保您的控制器已被指定为 mapView 的委托;

将为您调用viewForAnnotation(如果注释可见)。应该是这样的:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation

    if ([annotation isKindOfClass:[MKUserLocation class]])
        return nil;

    if ([annotation isKindOfClass:[MyAnnotation class]])
    
        MyAnnotation *customAnnotation = annotation;

        static NSString *annotationIdentifier = @"MyAnnotation";
        MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
        if (!annotationView)
        
            annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationIdentifier];
            annotationView.canShowCallout = YES;
            annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        
        else
        
            annotationView.annotation = annotation;
        

        annotationView.image = [UIImage imageNamed:customAnnotation.imageName];

        return annotationView;
    

    return nil;

注意,animatesDrop 是一个 MKPinAnnotationView 选项,您不能使用自定义注释视图。但是,如果您愿意,很容易实现(参见How can I create a custom "pin-drop" animation using MKAnnotationView?)。我建议你先处理基本的注解视图,然后再看自定义注解视图的拖放动画。

【讨论】:

那么我该如何调整注解的设置呢?因为现在我使用类似的东西: pinView.rightCalloutAccessoryView = PicButton;但这也不起作用 @BlackMagic 使用更完整的代码示例查看我修改后的答案。 非常感谢,这正是我所需要的。

以上是关于为啥我的 MKPointAnnotation 不是自定义的?的主要内容,如果未能解决你的问题,请参考以下文章

向 MKPointAnnotation 添加按钮?

拖动时更新 MKPointAnnotation 对象

自定义 MKPointAnnotation 颜色

MKPointAnnotation 到 MKMapItem

MKPointAnnotation 不再在 iOS 11 中显示标题

获取 MKPointAnnotation 标题