7
votes

Redimensionner l'image MkannotationView lorsque la carte effectue un zoom avant et arrière?

ce que j'ai

J'ai environ 150 mkannotationviews sur une carte. Chaque mkannotationview a une image qui remplace la goupille par défaut.

Qu'est-ce qui se passe maintenant

Lorsque la carte fait zoomer, les vues mkannotation sont plus petites et le contraire lorsque Il effectue un zoom arrière.

ce que je souhaite est arrivé

Eh bien, je veux que ce soit l'inverse. Depuis quand la carte est petite, je souhaite que les Vuies Mkannotation soient plus petites afin que l'utilisateur puisse les voir tous, et lorsqu'il est zoomé, je souhaite qu'ils seront plus grands.

Quel code Loin

Je sais comment obtenir le changement de zoom, et je sais que je peux obtenir le "PMAPView.region.span.latutudesdelta" comme référence pour le montant du zoom. Et je sais que je peux changer l'annotationview.frame. xxx

peut-il m'aider avec ça s'il vous plaît? merci Shani


0 commentaires

5 Réponses :


27
votes

En réalité sur la valeur par défaut MKMAPView, l'annotation (E.G. code PIN ou image) et l'annotation (par exemple la bulle) restent de la même taille que vous effectuez un zoom avant ou arrière. Ils ne font pas échelle. Mais je reçois votre point de vue sur la carte, ils semblent grandir car la carte effectue un zoom avant et la rétrécissement de la carte.

Il y a donc deux solutions à votre problème et ils fonctionnent légèrement différemment: P>

  1. Mettre en œuvre - (vide) MapView: (MKApview *) PMAPView RégionDidChangeanimated: (BOOL) Animated CODE> à partir de la référence de protocole MKMAPViewelegate - que vous avez déjà fait. LI>
  2. joindre un uipinchgesurerecognizer code> à l'objet MkmapView, puis mettez en œuvre l'action. Li> ol>

    option # 1 - MAPView: régionDidCangangANimaté: code> sera appelé à un défilement ou à un événement de zoom - essentiellement à tout moment, la région de la carte a changé comme son nom l'indique. Il en résulte un redimensionnement légèrement moins lisse des icônes, car les événements de la carte sont tirés de moins fréquemment. P>

    Mes préférences est destinée à l'option n ° 2 - Joindre un uipinchgeserecognizer code> à l'objet MkmapView et puis implémentez l'action. Les événements de geste de pincement sont tirés assez rapidement, vous obtenez donc un redimensionnement en douceur de l'icône. Et ils ne tirent que pour un événement de pincement reconnu - ils ne se tiraient donc pas pendant un événement de défilement. P>

    Les méthodes d'action invoquées doivent être conformes à l'une des signatures suivantes: P>

    - (vide) manipulable; code>
    - (vide) manuser: (uigesurerecognizer *) gesturerecognizer; code> p> BlockQuote>

    Vous devez faire attention à ne pas remplacer le comportement de zoom par défaut des cartes. Voir ce message: "UIMAPView: UIPINCHGESTERERECOVIMIZER NE PAS appelé" pour plus d'informations. Réponse courte est que vous devez implémenter devrait-on reconnaîtreImommognynamise -LultierecognizerCognizer: Code> et retourne oui. P>

    Tout dit ici est un exemple de code: p>

    - (void)formatAnnotationView:(MKAnnotationView *)pinView forMapView:(MKMapView *)aMapView {
        if (pinView)
        {
            double zoomLevel = [aMapView zoomLevel];
            double scale = -1 * sqrt((double)(1 - pow((zoomLevel/20.0), 2.0))) + 1.1; // This is a circular scale function where at zoom level 0 scale is 0.1 and at zoom level 20 scale is 1.1
    
            // Option #1
            pinView.transform = CGAffineTransformMakeScale(scale, scale);
    
            // Option #2
            UIImage *pinImage = [UIImage imageNamed:@"YOUR_IMAGE_NAME_HERE"];
            pinView.image = [pinImage resizedImage:CGSizeMake(pinImage.size.width * scale, pinImage.size.height * scale) interpolationQuality:kCGInterpolationHigh];
        }
    }
    


2 commentaires

Hey. Je vais essayer cela, merci pour une bonne réponse. Et aucun souci d'approuver :)


C'est vrai, ne fonctionne plus sur iOS6. Quelqu'un a-t-il trouvé une solution pour cela?



1
votes

Désolé de mon mauvais anglais ... mais je veux juste aider quelqu'un.

Merci beaucoup, funktional. Votre réponse est géniale ... sa fonctionne parfaitement sur iOS5! Mais ceci est invalidé sur iOS6, et il semble qu'il n'y ait aucune solution pour résoudre ce problème pour l'instant. P>

Mais enfin, je l'ai résolu de manière stupide / statique et cela fonctionne bien sur les deux iOS. Je ne vais pas trop expliquer. C'est ce que j'ai fait dans mon projet. P>

  1. L'image de la mkannotation est nommée pin.png (la taille est 20x20) p> li>

  2. J'ai créé cinq autres images avec une taille différente pour un niveau de zoom différent (18x18, 16x16, 14x14, 12x12, 10x10) et ils sont nommés PIN-5.PNG, PIN-4.PNG, PIN-3.PNG , pin-2.png, pin-1.png. p> li>

  3. J'ai supprimé tout le code sur le calcul de la balance dans la formatannénotationview et ajouté cette ligne p>

    -(NSString *)getImageLevel{
    
    NSString* output;
    
    double zoomLevel = [self getZoomLevel:_mapview];
    
    
    if(zoomLevel >= 19.0)
        output = @"";
    else if(zoomLevel < 19.0 && zoomLevel >= 18.0)
        output = @"-5";
    else if(zoomLevel < 18.0 && zoomLevel >= 17.0)
        output = @"-4";
    else if(zoomLevel < 17.0 && zoomLevel >= 16.0)
        output = @"-3";
    else if(zoomLevel < 16.0 && zoomLevel >= 15.0)
        output = @"-2";
    else 
        output = @"-1";
    
    return output;}
    
  4. aussi, changez ceci de p>

    UIIMAGE * pinimage = [UIIMAGE Imagenamed: @ "Your_Image_Name_Here"]; p>

    à p>

    UIIMAGE * pinimage = [[[[[UIIMAGE ALLOC] INITWithContentsOffile: Imagename]; P> Li>

  5. Ajouter cette fonction P>

    NSString* imageName = 
        [NSString stringWithFormat:@"%@%@.png", 
        [imageName substringToIndex:[imageName length]-4 ], 
        [self getImageLevel]];
    


0 commentaires

1
votes

Une méthode alternative serait de réapparaître la propriété image de la vue Annotation. Un exemple est affiché dans cet article


0 commentaires

1
votes

à Swift 3, cela a fonctionné pour moi. Mon image était à 100% au niveau 19, donc 1/19 me donne 0.5263158 qui est mon échelle linéaire: xxx


1 commentaires

Il ne fonctionne que pour une nouvelle annotation créée sur zoom arrière, une annotation déjà créée a une taille différente de zoom arrière, avez-vous une solution



4
votes

Réponse de Funktional à Swift 3: XXX


0 commentaires