MKMarkerAnnotationView не показывает - PullRequest
1 голос
/ 18 мая 2019

Настройка вида карты с аннотацией ближайших кафе.Но когда я пытаюсь настроить аннотации, используя 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 голосов
/ 19 мая 2019

Обратите внимание, что ваше сообщение говорит, что это 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

...