/ / Z-поръчване на MKAnnotationViews - iphone, mapkit, mkpinannotationview

Z-подреждане на MKAnnotationViews - iphone, mapkit, mkpinannotationview

Аз съм доста разочарован отограничения на MKMapKit. Сегашният ми проблем е свързан с подреждането на изгледи с анотации, особено що се отнася до докосвания. Ако приемете по подразбиране z-order, mapkit ви дава:

  1. Поръчката изглежда случайна. Z-редът не е свързан с реда, в който са добавени анотациите.
  2. Ако една анотация завършва върху друга,докосването на горната анотация обикновено води до извивката за долната анотация. Изглежда, че откриването на удара не "уважава дори реда на изтегляне. Какво е това?"

Опитах да реша # 1, като използвам нещо подобно на следния код, който се намира в мрежата (който е създаден, за да даде известен контрол върху реда на z)

- (void) mapView:(MKMapView *) mapView didAddAnnotationViews: (NSArray *) изгледи { за (MKAnnotationView * annView в изгледите) { TopBottomAnnotation * ann = (TopBottomAnnotation *) [анотация на annView]; ако ([ann top]) { [[annView superview] донесеSubviewToFront: annView]; } else { [[annView надзор] sendSubviewToBack: annView]; } }  }

Извършва се през изгледите към пояснителните бележки, предадени наmapView: didAddAnnotationViews: и коригирането на техния z-ред изглежда да фиксира # 1. Проблемът е, че сега изгледите на извивката вече не винаги са отгоре на изгледите на поясненията. MapKit изглежда много объркан за слоевете (извивките трябва да бъдат нарисувани в слой над всички изгледи за анотации). Мога дори да разбера как става объркан, тъй като всички MKAnnotationViews получавате имат същия супервайз (частен клас MKOverlayView). Може би си мислите, че всеки разумен дизайн би привлякъл извикванията за този изглед.

Някой успешно ли е решил # 1 или # 2?

Отговори:

8 за отговор № 1

Ако имате персонализиран annotationView (който звучи като че ли вече имате), можете да опитате да добавите това:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.superview bringSubviewToFront:self];
[super touchesBegan:touches withEvent:event];
}

Страничният ефект е, че всеки път, когато даден маркер е докоснат, той също се появява в предната част на z-order, което всъщност е разумно, тъй като това е това, на което се фокусира потребителят.


7 за отговор № 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

6 за отговор № 3

Изпробвайте друго решение, настройте слоя "s zPosition (annotationView.layer.zPosition)" в:

(void) mapView: (MKMapView *) mapView didAddAnnotationViews: (NSArray *) изгледи;