it-swarm.com.ru

Google Maps iOS SDK переместить кнопку «Мое местоположение» в левый нижний угол

При использовании Google Maps для iOS SDK кнопка "Мое местоположение" по умолчанию размещается в правом нижнем углу:

enter image description here

Я хотел бы разместить его в левом нижнем углу (да, я понимаю, что должен быть осторожен, чтобы не заслонить там логотип Google). Я не верю, что в SDK есть "официальный" способ сделать это, но на основе этот ответ Я выяснил, как заполучить подпредставление кнопки "Мое местоположение", чтобы я мог расположить его ,.

Смущает меня то, какие значения я должен дать рамке представления My Location и/или границам, чтобы получить его там, где я хочу. Для начала кнопка "Мое местоположение" в том виде, в котором она находится в данный момент, имеет frame.Origin.x = -74 и frame.Origin.y = -54. Это первый раз, когда я видел отрицательные координаты для frame.Origin.x или frame.Origin.y, и я даже не уверен, как iOS обрабатывает отрицательные координаты. Моей первой мыслью было, например, frame.Origin.x = -74 эквивалентен [view superview].frame.size.width - 74, т.е. отрицательное значение вычитается из ширины или высоты суперпредставления. Но потом я посмотрел на ширину и высоту суперпредставления, и они оба 0.0. Вот мой код, который выводит некоторую информацию как о карте, так и о фреймах и границах кнопки my location:

- (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);
            }
        }
    }
}  

И вот вывод:

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

В качестве простого теста я попытался расположить кнопку "Мое местоположение" в верхнем левом углу с помощью:

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

но тогда кнопка "Мое местоположение" вообще не отображалась.

Я также попробовал небольшие модификации существующих значений (например, изменив frame.Origin.x с -76.0 на -66.0 и могу видеть разницу в позиции, поэтому, по крайней мере, я уверен, что я изменяю позицию правильного представления. Я все еще не понимаю i) как работают отрицательные координаты и ii) как правильно позиционировать вид в этом конкретном сценарии. После прочтения ответов на этот вопрос я подумал, что у меня есть разумное представление о рамах и границах вида, но, учитывая, что я еще не заставил это работать, очевидно, нет.

8
Bryce Thomas

Самый простой способ решить эту проблему - изменить рамку и маску автоизменения кнопки сразу после создания вида карты.

UIButton* myLocationButton = (UIButton*)[[mapView_ subviews] lastObject];
myLocationButton.autoresizingMask = UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleTopMargin;
CGRect frame = myLocationButton.frame;
frame.Origin.x = 5;
myLocationButton.frame = frame;

EDIT: Извините, я поместил кнопку в верхнем правом углу. Обновил мой код, чтобы разместить его в левом нижнем углу.

Примечание: в настоящее время от Google нет API для получения кнопки местоположения. Первая строка может не работать в будущих выпусках SDK.

Вы также должны создать запрос функции здесь .

Другой вариант - создать кнопку самостоятельно и добавить ее в качестве подпредставления на карту. Код обработчика кнопки довольно прост:

  CLLocation *location = mapView_.myLocation;
  if (location) {
    [mapView_ animateToLocation:location.coordinate];
  }
20
Felix

Вы можете использовать заполнение GMSMapView.

GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-37.81969
                                                        longitude:144.966085
                                                             zoom:4];
_mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];

_mapView.settings.myLocationButton = YES;
_mapView.myLocationEnabled = YES;
_mapView.padding = UIEdgeInsetsMake(0, 0, kOverlayHeight, 0);
self.view = _mapView;

Swift 3

self._mapView.padding = UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 0)

enter image description here

9
3lvis

в Swift 3 xcode 8

func moveLocationButton() -> Void{
     for object in mapView.subviews{
        for obj in object.subviews{
           if let button = obj as? UIButton{
             let name = button.accessibilityIdentifier
                if(name == "my_location"){
                        //config a position
                        button.center = self.view.center 
                    }
                }
            }
        }
    }
5
Franklin Samboni Castillo
for (UIView *object in mapView_.subviews) {
    if([[[object class] description] isEqualToString:@"GMSUISettingsView"] )
    {
        for(UIView *view in object.subviews) {
            if([[[view class] description] isEqualToString:@"UIButton"] ) {
                CGRect frame = view.frame;
                frame.Origin.y -= 60;
                view.frame = frame;
            }
        }

    }
};
2
Spydy
for (UIView *object in _mapView.subviews) {
    if([[[object class] description] isEqualToString:@"GMSUISettingsPaddingView"] )
    {
        for (UIView *settingView in object.subviews) {
            if([[[settingView class] description] isEqualToString:@"GMSUISettingsView"] )
            {
                for(UIView *view in settingView.subviews) {
                    if([[[view class] description] isEqualToString:@"GMSx_QTMButton"] ) {
                        CGRect frame = view.frame;
                        frame.Origin.y -= 60;
                        view.frame = frame;
                    }
                }
            }
        };

    }
}
0
Vikash Rajput

По состоянию на июль 2015 года это можно сделать следующим образом:

for (UIView *object in mapView_.subviews) {
    if([[[object class] description] isEqualToString:@"GMSUISettingsView"] )
    {
        for(UIView *view in object.subviews) {
            if([[[view class] description] isEqualToString:@"GMSx_QTMButton"] ) {
                CGRect frame = view.frame;
                frame.Origin.y -= 60;
                view.frame = frame;
            }
        }

    }
};
0
CoachNono