Проблема с перекрывающимися аннотациями (MKAnnotationView) на карте - PullRequest
9 голосов
/ 18 марта 2010

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

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

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

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

Пожалуйста, любая идея приветствуется (даже грязные решения)!

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

CustomAnnotation.h

@interface CustomAnnotation : NSObject <MKAnnotation> {
   @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 <MKAnnotation>)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;
}

Ответы [ 4 ]

2 голосов
/ 22 апреля 2010

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

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

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

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

Работает довольно хорошо.

0 голосов
/ 15 декабря 2011

Я добавил UITapGestureRecognizer в представление спереди, и это решило проблему для меня.

В вашем случае добавление распознавателя жестов в CustomAnnotationView должно решить проблему.

0 голосов
/ 21 октября 2010

После ответа Александра я отключил все свои пользовательские объекты MKAnnotationViews с помощью

annView.enabled = NO

, чтобы они не реагировали на поведение выбора MKMapView по умолчанию, и реализовал в моем пользовательском MKAnnotationView следующее:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
 self.enabled = YES;
 [(MKMapView*)self.superview selectAnnotation:self.annotation animated:NO];
}

Это решение прекрасно работает на iOS 4. Кажется, что отключение MKAnnotationView не отключает его userInteractionEnabled, тогда как на iOS 3 это делает.Все еще ищите решение для iOS 3 ...

EDIT : на самом деле, это похоже на ошибку в iOS 4.1.В iOS 4.2 отключение булавки также отключает сенсорные события.Поэтому этот метод работает только для 4.1 и, возможно, 4.0.

0 голосов
/ 21 апреля 2010

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

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

...