Проблема с перекрывающимися аннотациями (MKAnnotationView) на карте

В моем приложении для iPhone я использую MapKit с MKMapView и пользовательским MKAnnotationView.

Проблема состоит в том, когда перекрытие аннотаций на карте (в моем приложении, аннотации являются фотографиями, и те фотографии могут наложиться), и когда Вы касаетесь на аннотации, которая появляется на передней стороне, именно другая аннотация (на спине) получает событие (кажется, случаен).

Я не нашел способа отправить событие в переднюю аннотацию. Я не могу полагать, что эта ошибка/проблема не имеет никакого решения!

Z упорядочивание и Порядок перекрывающихся вопросов об аннотациях на stackoverflow не помог мне так очень.

Любая идея приветствуется (даже грязные решения)!

Вот часть моего кода (ничто не полагает, очень распространенный):

CustomAnnotation.h

@interface CustomAnnotation : NSObject  {
   @private
   CustomAnnotationView* view;
}

    @property (nonatomic, retain) CustomAnnotationView* view;

@end

CustomAnnotation.m

@implementation CustomAnnotation

@synthetize view;

CustomAnnotationView.h

@interface CustomAnnotationView : MKAnnotationView {
}

@end

CustomAnnotationView.m

@implementation CustomAnnotationView

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
// Do something related to the annotation tapped
}

@end

Основной класс...//Аннотации добавляется и некоторые из них перекрытия с другими.

- (void)addAnnotation:(CustomAnnotation*)annotation {
    [map addAnnotation:annotation];
}

...

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

    NSString* identifier = getIdentifierFromAnnotation(annotation);
    CustomAnnotationView* view;
    if(!(view = (CustomAnnotationView*)[map dequeueReusableAnnotationViewWithIdentifier:identifier])) {
        view = [[CustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier: identifier];
        [(CustomAnnotation*)annotation setView:view];
        [view release];
    }
    return view;
}

9
задан Community 23 May 2017 в 10:29
поделиться

2 ответа

Наконец, лучший способ, который я нашел и который позволяет избежать потери функций карты, - это:

  • разрешить прослушивателю касания в CustomAnnotationView (touchesEnded) (в каждой аннотации)

  • при получении события касания передать событие в основной класс

  • основной класс зацикливается на аннотациях и сохраняет аннотацию, которая имеет хорошее расположение (событие касания в рамке аннотации) и находится впереди

Это работает очень хорошо.

2
ответ дан 5 December 2019 в 02:07
поделиться

См. Решение этого вопроса . По сути, вы создадите прозрачный UIView, который будет перехватывать все касания. Я не пробовал, но это может быть больше проблем, чем того стоит, если вам придется повторно реализовать все функции масштабирования в MKMapView.

Если у вас есть две (или более) совмещенные MKAnnotations, вы можете нажимать несколько раз, чтобы переключаться между ними. Это должно работать без каких-либо изменений в вашем приложении.

0
ответ дан 5 December 2019 в 02:07
поделиться