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;
}
Foi útil?

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.

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