iOS地图套件-是否可以根据地图类型更改地图pin?

iOS地图套件-是否可以根据地图类型更改地图pin?,ios,mapkit,mapkitannotation,Ios,Mapkit,Mapkitannotation,对此,我找不到确切的问题 我有一些定制别针,在标准地图上看起来不错。如果地图更改为卫星或混合,我想使用其他PIN 这可能吗 到目前为止,我已经试过了: annotationImageName = @"blackPin.png"; if (segment == 1) { NSLog(@"segment 1"); annotationImageName = @"whitePin.png"; } else if (segment ==

对此,我找不到确切的问题

我有一些定制别针,在标准地图上看起来不错。如果地图更改为卫星或混合,我想使用其他PIN

这可能吗

到目前为止,我已经试过了:

    annotationImageName = @"blackPin.png";

    if (segment == 1) {
        NSLog(@"segment 1");
        annotationImageName = @"whitePin.png";
    }
    else if (segment == 2) {
        NSLog(@"segment 2");
        annotationImageName = @"greyPin.png";
    }


}

MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"annotationPin"];

annotationView.image = [UIImage imageNamed:annotationImageName];

您可以创建自己的注释视图类,该类观察在地图视图的
mapType
属性更改时将发布的自定义通知:

@interface MyAnnotationView : MKAnnotationView
@property (nonatomic, strong) id<NSObject> observer;
@end

static NSString *kMapTypeChangeNotificationKey = @"com.domain.app.maptypechange";

@implementation MyAnnotationView

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self.observer];
}

- (instancetype)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier mapType:(MKMapType)mapType {
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];

    if (self) {
        [self updateImageBasedUponMapType:mapType];

        typeof(self) __weak weakSelf = self;
        self.observer = [[NSNotificationCenter defaultCenter] addObserverForName:kMapTypeChangeNotificationKey object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
            MKMapType mapType = [note.userInfo[@"mapType"] unsignedIntegerValue];
            [weakSelf updateImageBasedUponMapType:mapType];
        }];
    }

    return self;
}

- (void)updateImageBasedUponMapType:(MKMapType)mapType {
    if (mapType == MKMapTypeStandard) {
        self.image = [UIImage imageNamed:@"whitePin.png"];
    } else if (mapType == MKMapTypeSatellite) {
        self.image = [UIImage imageNamed:@"greyPin.png"];
    } else {
        NSLog(@"Unexpected mapType %lu", (unsigned long)mapType);
    }
}

@end

谢谢你的Akash,欢迎来到SO。我不认为当地图类型段更改时,会重新调用annotationView。谢谢您,先生。多棒的回答啊。@davidelmonte-我最初的回答是使用KVO,但当地图视图被释放时,这会带来问题。它有点不那么优雅,但你可以使用自定义通知,如我修改后的答案所示。几乎做到了。。上面可能有错误吗?我在
annotationView=[[MyAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:reuseIdentifier mapType:mapView.mapType]
@davidelMonte上得到一个编译错误-在我的原始答案中,我有
initWithAnnotation:reuseIdentifier:mapView:
并且在上面我用
initWithAnnotation:reuseIdentifier:mapType:
替换了它。你抓到零钱了吗?哎呀。我错过了
@interface MyAnnotationView : MKAnnotationView
@property (nonatomic, strong) id<NSObject> observer;
@end

static NSString *kMapTypeChangeNotificationKey = @"com.domain.app.maptypechange";

@implementation MyAnnotationView

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self.observer];
}

- (instancetype)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier mapType:(MKMapType)mapType {
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];

    if (self) {
        [self updateImageBasedUponMapType:mapType];

        typeof(self) __weak weakSelf = self;
        self.observer = [[NSNotificationCenter defaultCenter] addObserverForName:kMapTypeChangeNotificationKey object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
            MKMapType mapType = [note.userInfo[@"mapType"] unsignedIntegerValue];
            [weakSelf updateImageBasedUponMapType:mapType];
        }];
    }

    return self;
}

- (void)updateImageBasedUponMapType:(MKMapType)mapType {
    if (mapType == MKMapTypeStandard) {
        self.image = [UIImage imageNamed:@"whitePin.png"];
    } else if (mapType == MKMapTypeSatellite) {
        self.image = [UIImage imageNamed:@"greyPin.png"];
    } else {
        NSLog(@"Unexpected mapType %lu", (unsigned long)mapType);
    }
}

@end
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation {
    if ([annotation isKindOfClass:[MKUserLocation class]]) { return nil; }

    static NSString *reuseIdentifier = @"MyCustomAnnotation";

    MyAnnotationView *annotationView = (id)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseIdentifier];
    if (annotationView) {
        annotationView.annotation = annotation;
    } else {
        annotationView = [[MyAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseIdentifier mapType:mapView.mapType];
        annotationView.canShowCallout = true;
    }

    return annotationView;
}
- (IBAction)changedValueSegmentControl:(UISegmentedControl *)sender {
    if (sender.selectedSegmentIndex == 0) {
        self.mapView.mapType = MKMapTypeStandard;
    } else if (sender.selectedSegmentIndex == 1) {
        self.mapView.mapType = MKMapTypeSatellite;
    }

    [[NSNotificationCenter defaultCenter] postNotificationName:kMapTypeChangeNotificationKey object:self userInfo:@{@"mapType" : @(self.mapView.mapType)}];
}