В моем приложении для 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;
}
Наконец, лучший способ, который я нашел и который позволяет избежать потери функций карты, - это:
разрешить прослушивателю касания в CustomAnnotationView (touchesEnded) (в каждой аннотации)
при получении события касания передать событие в основной класс
основной класс зацикливается на аннотациях и сохраняет аннотацию, которая имеет хорошее расположение (событие касания в рамке аннотации) и находится впереди
Это работает очень хорошо.
См. Решение этого вопроса . По сути, вы создадите прозрачный UIView, который будет перехватывать все касания. Я не пробовал, но это может быть больше проблем, чем того стоит, если вам придется повторно реализовать все функции масштабирования в MKMapView.
Если у вас есть две (или более) совмещенные MKAnnotations, вы можете нажимать несколько раз, чтобы переключаться между ними. Это должно работать без каких-либо изменений в вашем приложении.