MKMarkerAnnotationView不显示

时间:2019-05-18 20:37:25

标签: ios mapkit mkmapview mkannotation mkannotationview

设置带有附近咖啡馆注释的地图视图。 但是,当我尝试使用MKMarkerAnnotationView自定义注释时,地图视图上没有任何显示。 当我记录标记时,帧是(0 0; 0 0);

我也尝试过别针,但还是没用。

我已经在演示板上设置了代表。

我还调试了视图控制器,其中存在标记视图,但是由于宽度和高度为零,所以它不显示它们?

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.cafeMap setShowsUserLocation:YES];

    [self.locationManager requestWhenInUseAuthorization];

    self.cafes = [NSMutableArray array];

    [self fetchData];

    [self.cafeMap registerClass:[MKAnnotationView class] forAnnotationViewWithReuseIdentifier:@"marker"];



}

-(void)fetchData{

    [self.networkManager fetchCafeData:^(NSArray * _Nonnull businesses) {
        for (NSDictionary* cafeInfo in businesses) {
            Cafe *cafe = [[Cafe alloc]initWithCafeInfo:cafeInfo];
            [self.cafes addObject:cafe];
        }

        for (Cafe *cafe in self.cafes) {
            [self.cafeMap addAnnotation:cafe];
        }
        [self.cafeMap showAnnotations:self.cafes animated:YES];
    }];

}

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


    if ([annotation isKindOfClass:[MKUserLocation class]]) {
        return nil;
    }
    MKMarkerAnnotationView *marker = [[MKMarkerAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"marker"];
    marker = (MKMarkerAnnotationView*) [mapView dequeueReusableAnnotationViewWithIdentifier:@"marker" forAnnotation:annotation];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeInfoLight];

    marker.rightCalloutAccessoryView = button;

    [marker setEnabled:YES];
    [marker setCanShowCallout:YES];
    NSLog(@"MARKER:%@",marker);
    return marker;


}

这是输出:

  

MARKER:>

1 个答案:

答案 0 :(得分:0)

请注意,您的消息说这是一个MKAnnotationView。这是因为您注册了MKAnnotationView而不是MKMarkerAnnotationView作为标识符。您想要:

[self.cafeMap registerClass:[MKMarkerAnnotationView class] forAnnotationViewWithReuseIdentifier:@"marker"];

顺便说一句,您应该可以将viewForAnnotation简化为:

MKAnnotationView *marker = [mapView dequeueReusableAnnotationViewWithIdentifier:@"marker" forAnnotation:annotation];

我个人将注释视图的配置移到其自己的子类中:

static NSString * const cafeClusteringIdentifier = @"cafe";

@interface CafeAnnotationView: MKMarkerAnnotationView
@end

@implementation CafeAnnotationView
- (instancetype)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]) {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeInfoLight];
        self.rightCalloutAccessoryView = button;
        self.canShowCallout = true;
        self.clusteringIdentifier = cafeClusteringIdentifier;
    }
    return self;
}

- (void)setAnnotation:(id<MKAnnotation>)annotation {
    [super setAnnotation:annotation];
    self.clusteringIdentifier = cafeClusteringIdentifier;
}
@end

通过这样做,我避免使用配置注释视图的代码使视图控制器膨胀。

请注意,我正在设置clusteringIdentifier,以便您喜欢MKMarkerAnnotationView的行为。

然后我要为MKMapViewDefaultAnnotationViewReuseIdentifier注册该课程:

[self.cafeMap registerClass:[CafeAnnotationView class] forAnnotationViewWithReuseIdentifier:MKMapViewDefaultAnnotationViewReuseIdentifier];

使用MKMapViewDefaultAnnotationViewReuseIdentifier的好处是您根本不需要实现viewForAnnotation。完全删除该方法的实现。在iOS 11及更高版本中,仅当需要执行一些特殊操作(例如为多种类型的注释具有多个自定义重用标识符)时,才需要实现viewForAnnotation

反正会产生:

cafes with callouts