Pergunta

Eu estou ficando bastante frustrados com as limitações de MKMapKit. Meu problema atual tem a ver com o z-ordenação de vistas de anotação, particularmente no que se refere aos toques. Se você aceitar o padrão ordem z do MapKit dá-lhe:

  1. A ordem parece aleatória. A ordem z não está relacionado com o pedido foram adicionadas as anotações.
  2. Se uma anotação termina no topo do outro, tocando a anotação superior, geralmente traz à tona a chamada para a anotação de fundo. Parece que a detecção hit nem sequer respeitar a ordem de desenho. O que há com isso?

Eu tentei resolver # 1 usando algo parecido com o seguinte código encontrado na web (que foi projetado para dar algum controle sobre ordem 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];
      }
   }

}

Running através das vistas de anotação passados ??para mapView: didAddAnnotationViews: e ajustar sua ordem z parece corrigir # 1. O problema é que agora os pontos de vista de chamada já não são sempre no topo para as vistas de anotação. O MapKit parece ficar muito confuso sobre as camadas (chamadas deve ser desenhado em uma camada acima de todas as vistas de anotação). Eu posso até descobrir como ele está ficando confuso uma vez que todos os MKAnnotationViews que recebe têm o mesmo superview (a classe privada MKOverlayView). Você poderia pensar que qualquer projeto razoável gostaria de chamar os textos explicativos sobre este ponto de vista de sobreposição.

Alguém resolveu # 1 ou # 2 com sucesso?

Foi útil?

Solução

Se você tem um annotationView personalizado (que soa como você já tem), você pode tentar adicionar o seguinte:

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

Um efeito colateral é que cada vez que um marcador é tocado também aparece à frente da ordem z, que na verdade é razoável, visto que isso é o que o usuário está focando.

Outras dicas

Ramin, que é perfeito para o que estou tentando fazer. Eu não tinha uma vista de anotação personalizado definido embora. Eu resolvi isso usando uma categoria e funcionou perfeito!

Aqui está o cabeçalho:

#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h>


@interface MKPinAnnotationView (ZIndexFix)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 
@end

E a Implementação:

#import "AEBMapViewCategory.h"
@implementation MKPinAnnotationView (ZIndexFix)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [self.superview bringSubviewToFront:self];
    [super touchesBegan:touches withEvent:event];
}
@end

Tente outra solução, zPosition configuração vista de anotação da camada (annotationView.layer.zPosition) em:

(void) mapView: (MKMapView *) mapView didAddAnnotationViews: (NSArray *) pontos de vista;

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top