Z-упорядочение MKAnnotationViews
Я расстраиваюсь с ограничениями MKMapKit. Моя текущая проблема связана с z-упорядочением аннотаций, особенно в том, что касается касаний. Если вы принимаете заданный по умолчанию z-порядок, mapkit дает вам:
- Порядок выглядит случайным. Z-порядок не связан с порядком добавления аннотаций.
- Если одна аннотация заканчивается поверх другой, прикосновение к верхней аннотации обычно вызывает выносок для нижней аннотации. Похоже, что обнаружение попадания даже не учитывает порядок розыгрыша. Что с этим?
Я попытался решить # 1, используя что-то похожее на следующий код, найденный в Интернете (который был разработан, чтобы дать некоторый контроль над z-порядком)
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
for (MKAnnotationView * annView in views) {
TopBottomAnnotation * ann = (TopBottomAnnotation *) [annView annotation];
if ([ann top]) {
[[annView superview] bringSubviewToFront:annView];
} else {
[[annView superview] sendSubviewToBack:annView];
}
}
}
Выполнение представлений аннотации, переданных в mapView: didAddAnnotationViews: и настройка их z-порядка, похоже, исправляет # 1. Проблема в том, что теперь представления выносок больше не всегда отображаются в верхней части аннотаций. MapKit, похоже, очень запутался в слоях (выноски должны быть нарисованы в слое выше всех представлений аннотаций). Я даже могу понять, как это запутывается, поскольку все MKAnnotationViews, которые вы получили, имеют тот же супервизор (частный класс MKOverlayView). Вы могли бы подумать, что любой разумный дизайн будет вычерчивать выноски об этом оверлейном представлении.
Кто-нибудь решил # 1 или # 2 успешно?
Ответы
Ответ 1
Если у вас есть пользовательский аннотационный просмотр (похоже, что у вас уже есть), вы можете попробовать добавить это:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.superview bringSubviewToFront:self];
[super touchesBegan:touches withEvent:event];
}
Побочным эффектом является то, что при каждом касании маркера он также попадает в переднюю часть z-порядка, что на самом деле разумно, поскольку это то, что пользователь фокусирует.
Ответ 2
Рамин, это прекрасно для того, что я пытаюсь сделать. Хотя у меня не было определенного аннотационного представления. Я решил это, используя категорию, и она отлично работала!
Вот заголовок:
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
@interface MKPinAnnotationView (ZIndexFix)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
@end
И реализация:
#import "AEBMapViewCategory.h"
@implementation MKPinAnnotationView (ZIndexFix)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.superview bringSubviewToFront:self];
[super touchesBegan:touches withEvent:event];
}
@end
Ответ 3
Попробуйте другое решение, установите слой представления аннотации zPosition (annotationView.layer.zPosition) в:
(void) mapView: (MKMapView *) mapView сделалAdDAnnotationViews: (NSArray *) views;