Problema com anotações sobrepostas (mkannotationview) no mapa
-
20-09-2019 - |
Pergunta
No meu aplicativo para iPhone, estou usando o MAPKIT com MKMAPView e MKANNOTATIONSVIEL CUSTAL.
O problema é quando as anotações se sobrepõem ao mapa (no meu aplicativo, as anotações são fotos e essas fotos podem se sobrepor) e quando você toca na anotação que aparece na frente, é outra anotação (nas costas) que recebe o evento (parece ser aleatório ).
Não encontrei nenhuma maneira de enviar o evento para a anotação frontal. Não acredito que esse bug/problema não tenha nenhuma solução!
Z ordenando e Ordem de anotações sobrepostas Perguntas sobre Stackoverflow não me ajudaram tanto.
Por favor, qualquer idéia é bem -vinda (mesmo soluções sujas)!
Aqui está um pouco do meu código (nada chique, muito comum):
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
Classe principal ... // Anotações são adicionadas e algumas delas se sobrepõem a outras.
- (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;
}
Solução
Finalmente, a melhor maneira que encontrei e isso evita a perda de funconidades do mapa é:
Deixe o ouvinte Touch no CustomannotationView (TouchEsended) (em cada anotação)
Ao receber o evento Touch, transfira o evento para a classe principal
Loops de classe principal sobre anotações e mantém a anotação que tem uma boa localização (evento de toque no quadro de anotação) e que está na frente
Funciona muito bem.
Outras dicas
Veja a solução para isso pergunta. Basicamente, você criará um UIView transparente que interceptará todos os toques. Eu não tentei, mas isso pode ser mais um problema do que vale a pena se você precisar reimplementar toda a funcionalidade de pinça para zoom no MKMAPView.
Se você tiver duas (ou mais) mkannotações co-localizadas, poderá tocar repetidamente para alternar entre os dois. Isso deve funcionar sem nenhuma alteração no seu aplicativo.
Seguindo a resposta de Alexandre, desativei todos os meus objetos personalizados do MkannotationViews com
annView.enabled = NO
Portanto, eles não respondem ao comportamento de seleção padrão do MKMAPView e implementado em meu MkannotationView personalizado o seguinte:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
self.enabled = YES;
[(MKMapView*)self.superview selectAnnotation:self.annotation animated:NO];
}
Esta solução funciona muito bem no iOS 4. Parece que desativar um mkannotationview não desative seu UserInteractionEnabled, enquanto no iOS 3 sim. Ainda estou procurando uma solução para iOS 3 ...
EDITAR: Na verdade, isso parece ser um bug no iOS 4.1. No iOS 4.2, desativar um PIN também desativa os eventos de toque. Portanto, esse método funciona apenas para 4.1 e possivelmente 4.0.
Adicionei o UITAPGestureRecognizer à vista na frente e isso resolveu o problema para mim.
No seu caso, a adição de um reconhecedor de gestos ao CustomAnnoTationView deve resolver o problema.