5 votes

Toute annotation n'est pas visible pour l'utilisateur dans MKMapView

Je suis en train d'utiliser MKMapView et j'ai ajouté plusieurs épingles d'annotation sur la carte. Toutes les annotations appartiennent à des pays différents, donc je ne peux pas rendre toutes les annotations visibles à l'utilisateur.

Veuillez essayer en utilisant les latitudes et longitudes ci-dessous pour l'annotation.

Latitude de la première annotation : 23.029690

Longitude de la première annotation : 72.527359

Latitude de la deuxième annotation : 34.210855

Longitude de la deuxième annotation : -118.622636

Code pour ajouter une annotation à la carte.

CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake([[dicObjects valueForKey:K_Latitude] doubleValue], [[dicObjects valueForKey:K_Longitude] doubleValue]);
MyCustomAnnotation *myCustomAnnotation = [[MyCustomAnnotation alloc]initWithTitle:[NSString stringWithFormat:@"%@           ",[dicObjects valueForKey:K_Title]] Subtitle:[NSString stringWithFormat:@"%@",[dicObjects valueForKey:K_SubTitle]] andDescritpion:[NSString stringWithFormat:@"%@",[dicObjects valueForKey:K_TitelDes]] withLocation:coordinate andImageName:[dicObjects valueForKey:K_Rating] andTagValue:intTempCounter];
[mapViewPledgeList addAnnotation:myCustomAnnotation];

MyCustomAnnotation.h

@interface MyCustomAnnotation : NSObject

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (copy, nonatomic) NSString *title;
@property (copy, nonatomic) NSString *subTitle;
@property (copy, nonatomic) NSString *titleDescritpion;
@property (copy, nonatomic) NSString *strImageName;
@property  int intTagValue;

- (id)initWithTitle:(NSString *)newTitle Subtitle:(NSString *)subTitle andDescritpion:(NSString *)titleDescritpion withLocation:(CLLocationCoordinate2D)location andTagValue:(int) intTag;
- (MKAnnotationView *)annotationView;
- (id)initWithTitle:(NSString *)newTitle Subtitle:(NSString *)subTitle andDescritpion:(NSString *)titleDescritpion withLocation:(CLLocationCoordinate2D)location andImageName:(NSString*) strImageName andTagValue:(int) intTag;
@end

MyCustomAnnotation.m

#import "MyCustomAnnotation.h"

@implementation MyCustomAnnotation

#pragma mark - Configuration de la vue personnalisée de l'annotation
- (MKAnnotationView *)annotationView{

    MKAnnotationView *annotationView = [[MKAnnotationView alloc]initWithAnnotation:self reuseIdentifier:K_ID_CUSTOM_ANNOTATION];
    annotationView.enabled = YES;
    annotationView.canShowCallout = YES;
    annotationView.image = kImage(_strImageName);

    UIButton *button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    button.frame = CGRectMake(0, 0, 23, 23);
    button.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
    button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
    [button setImage:[[UIImage imageNamed:@"NextArrow"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forState:UIControlStateNormal];
    annotationView.rightCalloutAccessoryView = button;

    return annotationView;
}

- (id)initWithTitle:(NSString *)newTitle Subtitle:(NSString *)subTitle andDescritpion:(NSString *)titleDescritpion withLocation:(CLLocationCoordinate2D)location andImageName:(NSString*) strImageName andTagValue:(int) intTag{

    self = [super init];

    if(self){
        _title = newTitle;
        _subTitle = subTitle;
        _titleDescritpion = titleDescritpion;
        _coordinate = location;

        if ([strImageName intValue] == 1) {
            _strImageName = @"MapViewPinRed";

        }else if([strImageName intValue] == 2){
            _strImageName = @"MapViewPinOrange";

        }else if ([strImageName intValue] == 3){
            _strImageName = @"MapViewPinYellow";

        }else if ([strImageName intValue] == 4){
            _strImageName = @"MapViewPinLightGreen";

        }else{
            _strImageName = @"MapViewPinGreen";

        }
    }

    return self;
}

@end

J'ai essayé la solution ci-dessous mais elle ne fonctionne pas.

1) Utilisation de MKMapRectUnion

MKMapRect zoomRect = MKMapRectNull;
    for (id  annotation in mapViewPledgeList.annotations)
    {
        MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
        MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);
        zoomRect = MKMapRectUnion(zoomRect, pointRect);
    }
    [mapViewPledgeList setVisibleMapRect:zoomRect animated:YES];

2) Utilisation de showAnnotations

[mapViewPledgeList showAnnotations:mapViewPledgeList.annotations animated:YES];

Problème : suggérer une solution pour rendre toutes les annotations visibles à l'utilisateur.

2voto

Emre YILMAZ Points 127

N'oubliez pas d'ajouter une annotation à la carte. Cela pourrait être le problème

[self.mapView addAnnotation:point];

1voto

Tarun Tyagi Points 1581

Vous devez indiquer à la mapView la valeur correcte de region qui est de type MKCoordinateRegion. Vous devez effectuer certains calculs avant de pouvoir indiquer à la mapView d'afficher la region correcte.

A. Trouver la valeur des variables suivantes en parcourant tout le tableau des coordonnées disponibles.

CLLocationDegrees minLatitude = // À calculer
CLLocationDegrees maxLatitude = // À calculer

CLLocationDegrees minLongitude = // À calculer
CLLocationDegrees maxLongitude = // À calculer

B. Calculer la coordonnée de centre pour la carte.

CLLocationCoordinate2D center = 
CLLocationCoordinate2DMake((maxLatitude+minLatitude)/2, (maxLongitude+minLongitude)/2);

C. Calculer les valeurs de latitudeDelta et longitudeDelta -

CLLocationDegrees latitudeDelta = ABS(maxLatitude-minLatitude)*2;
CLLocationDegrees longitudeDelta = ABS(maxLongitude-minLongitude)*2;

D. Calculer la span

MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);

E. Calculer la region et dire à votre mapView d'afficher ceci -

MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
[mapView setRegion:region animated:YES];

Il y a quelques considérations supplémentaires à prendre en compte, comme combien de latitudeDelta et longitudeDelta max/min vous souhaitez prendre en charge. Cela peut être appliqué à l'étape C lorsque vous calculez les valeurs.

J'espère que cela vous a aidé.

0voto

Dhaval Patel Points 319

Vous devez informer mapview pour parfaire la région afin que tous les pins d'annotation soient visibles.

Le code swift ci-dessous vous aidera.

extension MKMapView {
    func getAllAnnotationExpectCurrntLocation() -> [MKAnnotation] {
        var arrAnnotion: [MKAnnotation] = self.annotations
        arrAnnotion = arrAnnotion.filter { $0 !== self.userLocation }
        return arrAnnotion
    }

    func zoomToFitMapAnnotations() {
        guard self.annotations.count != 0 else {
            return
        }

        var topLeftCordinate = CLLocationCoordinate2D(latitude: -90, longitude: 180)
        var bottomRightCordinate = CLLocationCoordinate2D(latitude: 90, longitude: -180)

        for ann in self.getAllAnnotationExpectCurrntLocation() {
            topLeftCordinate.longitude = fmin(topLeftCordinate.longitude, ann.coordinate.longitude)
            topLeftCordinate.latitude = fmax(topLeftCordinate.latitude, ann.coordinate.latitude)

            bottomRightCordinate.longitude = fmax(bottomRightCordinate.longitude, ann.coordinate.longitude)
            bottomRightCordinate.latitude = fmin(bottomRightCordinate.latitude, ann.coordinate.latitude)
        }

        let latitude = topLeftCordinate.latitude - ((topLeftCordinate.latitude - bottomRightCordinate.latitude) * 0.5)
        let longitude = topLeftCordinate.longitude + ((bottomRightCordinate.longitude - topLeftCordinate.longitude) * 0.5)

        let latitudeDelta = fabs(topLeftCordinate.latitude - bottomRightCordinate.latitude) * 1.1
        let longitudeDelta = fabs(bottomRightCordinate.longitude - topLeftCordinate.longitude) * 1.1
        let span: MKCoordinateSpan = MKCoordinateSpan(latitudeDelta: latitudeDelta, longitudeDelta: longitudeDelta)

        let centerCordinate: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
        let region: MKCoordinateRegion = MKCoordinateRegion(center: centerCordinate, span: span)
        let newregion = self.regionThatFits(region)
        self.setRegion(newregion, animated: true)

    }
}

0voto

Hitesh Surani Points 2175

Q] Toutes les annotations restent visibles pour l'utilisateur.

  • Malheureusement, il n'est pas possible de définir un niveau de zoom minimum inférieur à la limite minimale de MKMapView.

  • Aussi, dans l'application officielle de cartographie d'Apple, le point ci-dessous n'est pas visible en même temps

    Latitude de la première annotation : 23.029690

    Longitude de la première annotation : 72.527359

    Latitude de la deuxième annotation : 34.210855

    Longitude de la deuxième annotation : -118.622636

Note : Nous ne pouvons pas zoomer dans la vue de la carte après avoir atteint sa limite minimale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X