Z-commande de MKAnnotationViews

voix
13

Je reçois assez frustré par les limites de MKMapKit. Mon problème actuel a à voir avec le z-ordre des vues d'annotation, en particulier en ce qui concerne des touches. Si vous acceptez l'ordre z par défaut la MapKit vous donne:

  1. L'ordre apparaît au hasard. Le z-ordre est sans rapport avec l'ordre des annotations ont été ajoutées.
  2. Si une annotation se termine au-dessus d'un autre, touchant l'annotation supérieure apporte généralement la légende pour l'annotation de fond. Il semble que la détection de succès ne respecte même pas l'ordre de tirage au sort. Quoi de neuf avec ça?

J'ai essayé la résolution # 1 en utilisant quelque chose de similaire au code suivant trouvé sur le web (qui a été conçu pour donner un certain contrôle sur ordre z)

- (void) Mapview: (MKMapView *) Mapview didAddAnnotationViews: (NSArray *) {vues
   pour (MKAnnotationView * annView dans les vues) {
      TopBottomAnnotation * ann = (TopBottomAnnotation *) [d'annotation annView];
      si ([haut ANN]) {
         [[AnnView superview] bringSubviewToFront: annView];
      } autre {
         [[AnnView superview] sendSubviewToBack: annView];
      }
   }

}

Courir à travers les vues d'annotation transmises à Mapview: didAddAnnotationViews: et en ajustant leur ordre z ne semble fixer # 1. Le problème est que maintenant les vues de légende ne sont plus toujours sur les vues d'annotation. Le MapKit semble être très confus au sujet des couches (doivent être tirées des légendes dans une couche au-dessus de toutes les vues d'annotation). Je peux même comprendre comment il se confondre puisque tous les MKAnnotationViews que vous recevez ont le même superview (une classe privée MKOverlayView). On pourrait penser que toute conception raisonnable attirerait les légendes de cette vue superposition.

Quelqu'un at-il résolu # 1 ou # 2 avec succès?

Créé 05/11/2009 à 17:04
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
8

Si vous avez un annotationView personnalisé (qui sonne comme vous avez déjà), vous pouvez essayer d'ajouter ceci:

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

Un effet secondaire est que chaque fois qu'un marqueur est touché il apparaît également à l'avant de l'ordre z, qui est en fait raisonnable puisque c'est ce que l'utilisateur se concentre.

Créé 05/11/2009 à 17:54
source utilisateur

voix
7

Ramin, qui est parfait pour ce que je suis en train de faire. Je n'ai pas eu une vue d'annotation personnalisée définie cependant. Je résolu ce problème en utilisant une catégorie et cela a fonctionné parfait!

Voici l'en-tête:

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


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

Et la mise en œuvre:

#import "AEBMapViewCategory.h"
@implementation MKPinAnnotationView (ZIndexFix)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [self.superview bringSubviewToFront:self];
    [super touchesBegan:touches withEvent:event];
}
@end
Créé 04/12/2009 à 19:40
source utilisateur

voix
6

Essayez zPosition (de annotationView.layer.zPosition) d'une autre solution vue, l'annotation de configuration en couche:

(Void) Mapview: (MKMapView *) Mapview didAddAnnotationViews: (NSArray *) vues;

Créé 03/05/2013 à 12:12
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more