2013-06-02 32 views
7

Sử dụng Google Maps dành cho iOS SDK, nút "My Location" là theo mặc định được đặt ở góc dưới bên phải:Google Maps iOS SDK di chuyển nút "My Location" xuống dưới tay trái góc

enter image description here

Tôi muốn đặt nó ở góc dưới cùng bên trái (vâng, tôi nhận ra rằng tôi cần phải cẩn thận để không làm mờ logo "Google" ở đó). Tôi không tin rằng SDK có cách "chính thức" để thực hiện việc này, nhưng dựa trên this answer Tôi đã tìm ra cách để có được một tổ chức của subview nút Vị trí của tôi để tôi có thể định vị nó.

Phần khiến tôi bối rối là những giá trị tôi nên đưa cho khung và/hoặc giới hạn của chế độ xem Vị trí của tôi để có được nó ở nơi tôi muốn. Đối với người mới bắt đầu, nút Vị trí của tôi như hiện tại là frame.origin.x = -74frame.origin.y = -54. Đây là lần đầu tiên tôi nhìn thấy tọa độ âm cho một số frame.origin.x hoặc frame.origin.y và tôi thậm chí không chắc cách iOS xử lý tọa độ phủ định. Suy nghĩ đầu tiên của tôi là frame.origin.x = -74 tương đương với [view superview].frame.size.width - 74, tức là giá trị âm được trừ khỏi chiều rộng hoặc chiều cao của người giám sát. Nhưng sau đó tôi nhìn vào chiều rộng và chiều cao của superview và cả hai đều là 0.0. Dưới đây là mã của tôi mà kết quả đầu ra một số thông tin về tất cả các bản đồ và các khung nút vị trí của tôi vọt:

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

Và đây là kết quả:

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 

tôi đã cố gắng như một thử nghiệm đơn giản để xác định vị trí các " My nút Vị trí" trong đầu góc tay trái với:

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

nhưng sau đó vào nút Vị trí của tôi không hiển thị gì cả.

Tôi cũng đã cố gắng sửa đổi nhỏ cho các giá trị hiện tại (ví dụ như thay đổi frame.origin.x-76.0--66.0 và có thể thấy sự khác biệt về vị trí, như vậy ít nhất tôi tự tin tôi đang thay đổi vị trí của các quan điểm đúng đắn. Tôi vẫn không hiểu i) cách phối hợp tiêu cực hoạt động và ii) cách định vị đúng cách trong khung cảnh cụ thể này. Sau khi đọc các câu trả lời cho this question Tôi nghĩ rằng tôi đã có một nắm bắt hợp lý trên khung xem và giới hạn, nhưng cho rằng tôi đã không nhận được điều này để làm việc được nêu ra, dường như không.

+0

trong 'loadView' bạn vừa phân bổ xem bản đồ với một siz e số không (làm cho nó được thay đổi kích cỡ để lấp đầy màn hình sau). Nó có thể là giá trị kiểm tra những gì tất cả các giá trị là tại một số điểm sau này - ví dụ như trong 'viewDidLoad' hoặc' viewDidAppear' hoặc một cái gì đó như thế? –

+0

Cũng có thể đáng để kiểm tra các giá trị của thuộc tính 'transform' của nút, để xem liệu biến đổi có được đặt thành một cái gì đó không bình thường hay không. –

Trả lời

18

Cách dễ nhất để giải quyết vấn đề này là thay đổi khung và tự động lấy mặt nạ của nút ngay sau khi chế độ xem bản đồ được tạo.

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

EDIT: Xin lỗi, tôi đặt các nút ở góc trên bên phải. Đã cập nhật mã của tôi để đặt mã ở góc dưới bên trái.

Lưu ý: hiện tại không có API nào từ Google để nhận nút vị trí. Dòng đầu tiên có thể không hoạt động trong các phiên bản tương lai của SDK.

Bạn cũng nên tạo yêu cầu tính năng here.

Một tùy chọn khác là tự tạo nút và thêm nút làm chế độ xem phụ vào bản đồ. Nút mã xử lý là khá dễ dàng:

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

Tôi đang đánh dấu sự chấp nhận này vì nó càng ít nhiều được hỏi. Tôi đã không tìm ra cách để thoát khỏi "padding" xung quanh nút được nêu ra mặc dù (ví dụ: thử 'frame.origin.x = 0' và nó vẫn ngồi một chút ra khỏi góc). Đặt 'contentEdgeInsets',' titleEdgeInsets' và 'imageEdgeInsets' thành' 0.0' trên UIButton dường như không thực hiện được. –

+1

Cập nhật: trong phiên bản 1.4.0.4450 của SDK Google Maps iOS, nút myLocation đã thay đổi vị trí của nó trong hệ thống phân cấp chế độ xem và do đó không còn có thể truy cập được với các [[mapView_ subviews] lastObject] đã đề cập ở trên. Tôi hiện đang sử dụng ... –

+0

cho (chế độ xem UIView * trong self.mapView.subviews) { NSString * viewClassString = NSStringFromClass ([chế độ xem]]; if ([viewClassString rangeOfString: @ "GMSUISettingsView"] Vị trí = NSNotFound.!) { for (UIView * View2 trong view.subviews) { if ([View2 isKindOfClass: [UIButton lớp]]) { _myLocationButton = (UIButton *) view2; }} }} –

2
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; 
      } 
     } 

    } 
}; 
0

Tính đến tháng bảy năm 2015, đây là một cách để làm điều đó:

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

    } 
}; 
8

Bạn có thể sử dụng miếng đệm của 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

+2

Swift 3: 'viewMap.padding = UIEdgeInsets (top: 0, trái: 0, đáy: 10, phải không: 0)' –

3

trong nhanh chóng 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 
        } 
       } 
      } 
     } 
    } 
+0

Không làm việc cho tôi –

0
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; 
        } 
       } 
      } 
     }; 

    } 
} 
Các vấn đề liên quan