gpt4 book ai didi

ios - MKMarkerAnnotationView 不显示

转载 作者:行者123 更新时间:2023-11-29 13:55:49 24 4
gpt4 key购买 nike

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

我也试过 pin,还是不行。

我已经在 Storyboard上设置了委托(delegate)。

我还调试了 View Controller ,那里有标记 View ,但它没有显示它们,因为宽度和高度为零?

- (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:<MKAnnotationView: 0x7f9fa3f333b0; frame = (0 0; 0 0); layer = <CALayer: 0x60000253d220>>

最佳答案

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

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

顺便说一句,您应该能够将 viewForAnnotation 简化为:

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

就个人而言,我会将注释 View 的配置移动到它自己的子类中:

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

通过这样做,我避免了使用配置注释 View 的代码使我的 View Controller 膨胀。

请注意,我正在设置 clusteringIdentifier这样您就可以享受 MKMarkerAnnotationView 的行为。

然后我会为 MKMapViewDefaultAnnotationViewReuseIdentifier 注册该类(class):

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

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

无论如何,这会产生:

cafes with callouts

关于ios - MKMarkerAnnotationView 不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56202665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com