Google Maps iOS SDK déplacer “Ma position” bouton en bas à gauche

À l'aide de Google Maps pour iOS SDK, la "Ma position" bouton par défaut est placé dans le coin en bas à droite:

Google Maps iOS SDK déplacer “Ma position” bouton en bas à gauche

J'aimerais le placer dans le coin inférieur gauche (oui, je me rends compte que j'ai besoin d'être prudent de ne pas dissimuler le logo Google). Je ne crois pas que le kit de développement a un "officiel" de la façon de le faire, mais en se fondant sur cette réponse j'ai compris comment faire pour obtenir une prise de les Mon bouton d'Emplacement sous-vue afin que je puisse position.

La partie qui m'a confondu est ce que les valeurs que je devrais donner Mon Emplacement de la vue du cadre et/ou les limites de l'obtenir où je veux. Pour commencer, le bouton Ma position tel qu'il est actuellement a frame.origin.x = -74 et frame.origin.y = -54. C'est la première fois que j'ai vu des coordonnées négatives pour un frame.origin.x ou un frame.origin.y et je ne suis même pas sûr de savoir comment iOS gère des coordonnées négatives. Ma première pensée a été que, par exemple, frame.origin.x = -74 est équivalent à [view superview].frame.size.width - 74, c'est à dire la valeur est négative sont soustraites à partir de la largeur ou de la hauteur de la superview. Mais ensuite j'ai regardé la largeur et la hauteur de la superview et ils sont à la fois 0.0. Voici mon code qui affiche des informations sur la carte et le bouton ma position des cadres et des limites:

- (void)loadView {
GMSCameraPosition *cam = [GMSCameraPosition cameraWithLatitude:jcuTownsvilleCenterCampusLat longitude:jcuTownsvilleCenterCampusLon zoom:17];
self.campusMap = [GMSMapView mapWithFrame:CGRectZero camera:cam];
self.campusMap.myLocationEnabled = YES;
self.campusMap.settings.myLocationButton = YES;
self.view = self.campusMap;
for (UIView *view in self.campusMap.subviews) {
NSLog(@"view.description: %@",view.description);
if ([view isKindOfClass:[UIButton class]]) {
//these four values in the conditional below are just what happen to
//be the values corresponding to the "my location button" in Google Maps
//for iOS SDK version 1.3.0.3430.  They might change over time, so this
//code is somewhat fragile.
if (view.frame.size.width == 76 && view.frame.size.height == 54 &&
view.frame.origin.x == -76 && view.frame.origin.y == -54) {
NSLog(@"we may have found the 'my location' button");
NSLog(@"self.campusMap coord stats:");
NSLog(@"bounds.origin.x: %f", self.campusMap.bounds.origin.x);
NSLog(@"bounds.origin.y: %f", self.campusMap.bounds.origin.y);
NSLog(@"bounds.size.width: %f", self.campusMap.bounds.size.width);
NSLog(@"bounds.size.height: %f", self.campusMap.bounds.size.height);
NSLog(@"frame.origin.x: %f", self.campusMap.frame.origin.x);
NSLog(@"frame.origin.y: %f", self.campusMap.frame.origin.y);
NSLog(@"frame.size.width: %f", self.campusMap.frame.size.width);
NSLog(@"frame.size.height: %f", self.campusMap.frame.size.height);
NSLog(@"view coord stats:");
NSLog(@"bounds.origin.x: %f", view.bounds.origin.x);
NSLog(@"bounds.origin.y: %f", view.bounds.origin.y);
NSLog(@"bounds.size.width: %f", view.bounds.size.width);
NSLog(@"bounds.size.height: %f", view.bounds.size.height);
NSLog(@"frame.origin.x: %f", view.frame.origin.x);
NSLog(@"frame.origin.y: %f", view.frame.origin.y);
NSLog(@"frame.size.width: %f", view.frame.size.width);
NSLog(@"frame.size.height: %f", view.frame.size.height);
}
}
}
}  

Et voici le résultat:

self.campusMap coord stats:    
bounds.origin.x: 0.000000  
bounds.origin.y: 0.000000  
bounds.size.width: 0.000000  
bounds.size.height: 0.000000  
frame.origin.x: 0.000000  
frame.origin.y: 0.000000  
frame.size.width: 0.000000  
frame.size.height: 0.000000  
view coord stats:  
bounds.origin.x: 0.000000  
bounds.origin.y: 0.000000  
bounds.size.width: 76.000000  
bounds.size.height: 54.000000  
frame.origin.x: -76.000000  
frame.origin.y: -54.000000  
frame.size.width: 76.000000  
frame.size.height: 54.000000

J'ai essayé comme un simple test de position "Ma position" bouton dans le haut à gauche avec:

CGRect frame = view.frame;
frame.origin.x = 0;
frame.origin.y = 0;
frame.size.width = 76;
frame.size.height = 54;
[view setFrame:frame];

mais alors le bouton Ma position n'a pas pu montrer à tous.

J'ai aussi essayé de petites modifications aux valeurs existantes (par exemple, changement de frame.origin.x de -76.0 à -66.0 et peut voir la différence de position, donc au moins je suis confiant, je suis à la modification de la position de la vue de droite. Je ne comprends toujours pas comment des coordonnées négatives de travail et ii) comment positionner correctement le point de vue dans ce scénario spécifique. Après avoir lu les réponses à cette question je pensais que j'avais une assez bonne compréhension à la vue des cadres et des limites, mais étant donné que je n'ai pas eu à travailler encore, apparemment pas.

Dans loadView vous avez seulement affecté la vue de la carte avec une taille de zéro (ce qui le fait être redimensionné de façon à remplir l'écran plus tard). Il pourrait être utile de vérifier que toutes les valeurs sont à un moment plus tard - par exemple dans les viewDidLoad ou viewDidAppear ou quelque chose comme ça?
Il pourrait également être utile de vérifier les valeurs du bouton transform propriété, pour voir si la transformation est définie à quelque chose d'inhabituel.

OriginalL'auteur Bryce Thomas | 2013-06-02