iOS – MKMapView showAnnotations: animé: avec rembourrage?

Je veux pouvoir zoomer sur mon MKMapView pour l'adapter à ses annotations. J'ai réussi à le faire en utilisant la méthode showAnnotations de showAnnotations . Mais je voudrais aussi append un peu de remplissage ou d'encart à partir de la bordure de la carte. C'est parce que j'ai une vue semi-transperant qui recouvre la partie supérieure de ma carte, et je ne veux pas que les annotations soient des endroits derrière cette vue. J'ai essayé ceci:

 [self.mapView showAnnotations:annotations animated:YES]; [self.mapView setVisibleMapRect:self.mapView.visibleMapRect edgePadding:UIEdgeInsetsMake(100, 20, 10, 10) animated:NO]; 

Mais ça ne marche pas comme je l'aurais espéré. Des idées sur comment je pourrais le faire différemment?

Vous le faites de la bonne façon. Essayez de changer le rembourrage, vous verrez la différence.

Autrement, il doit y avoir quelque chose d'autre dans votre code qui empêche de changer la vue

EDIT: J'avais totalement tort. Essaye ça:

Créer une variable d'instance

 BOOL _mapNeedsPadding; 

et l'initialiser à NO;

Définissez ensuite votre délégué mapView sur self et ajoutez un en-tête de votre class

Ensuite, ajoutez ceci à votre class

 - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{ if(_mapNeedsPadding){ _mapNeedsPadding = NO; [self.mapView setVisibleMapRect:self.mapView.visibleMapRect edgePadding:UIEdgeInsetsMake(100, 20, 10, 10) animated:YES]; } } 

Et enfin appelez votre showAnnotations fonctionne comme ceci:

 _mapNeedsPadding = YES; [self.mapView showAnnotations:annotations animated:YES]; 

Le showAnnimation triggersra la fonction regionDidChangeAnimated. Vous devez définir _mapNeedsPadding à NO après avoir changé visibleMapRect car cette fonction (setVisibleMapRect: self) triggersra également regionDidChangeAnimated.

J'espère que cela t'aides !

Vous pouvez aussi simplement utiliser

 [self.mapView showAnnotations:annotations animated:YES]; self.mapView.camera.altitude *= 1.4; 

pour faire un zoom arrière un peu. Fonctionne bien pour moi.

À partir de iOS8, MKMapView possède une propriété layoutMargin . Lorsque cette centerRegion: est définie, centerRegion: showAnnotations: et toutes les methods qui tentent de placer un rectangle dans la vue de la carte prendront en count les marges de layout mentionnées ci-dessus.

Si votre vue translucide a une hauteur de 40 points et est attachée en haut de la carte, les parameters mapView.layoutMargin = UIEdgeInsetMake(40, 0, 0, 0) feront la magie.

Si vous ciblez iOS7, l'affichage de la carte utilise le guide de layout haut et bas de son controller contenant pour également compenser son contenu. Vous pouvez donc replace la méthode topLayoutGuide du controller pour renvoyer la longueur souhaitée.

 class ViewController: UIViewController { override var topLayoutGuide: UILayoutSupport { return MapLayoutGuide(length: 40) } } class MapLayoutGuide: NSObject, UILayoutSupport { var length: CGFloat init(length: CGFloat) { self.length = length super.init() } @available(iOS 9.0, *) var bottomAnchor: NSLayoutYAxisAnchor { return NSLayoutYAxisAnchor() } @available(iOS 9.0, *) var topAnchor: NSLayoutYAxisAnchor { return NSLayoutYAxisAnchor() } @available(iOS 9.0, *) var heightAnchor: NSLayoutDimension { return NSLayoutDimension() } }