9

Google Maps for iOS SDK を使用すると、デフォルトで [現在地] ボタンが右下隅に配置されます。

ここに画像の説明を入力

左下隅に配置したいと思います (はい、「Google」のロゴが隠れないように注意する必要があります)。SDKにこれを行う「公式」の方法があるとは思いませんが、この回答に基づいて、現在地ボタンのサブビューを取得して配置できるようにする方法を見つけました。

私が混乱している部分は、現在地ビューのフレームや境界にどのような値を与える必要があるかということです。手始めに、現在の現在地ボタンにはframe.origin.x=-74frame.origin.y=があり-54ます。frame.origin.xaまたは aの負の座標を見たのはこれが初めてであり、frame.origin.yiOS が負の座標をどのように処理するかさえわかりません。私の最初の考えは、egframe.origin.x = -74は と同等である[view superview].frame.size.width - 74、つまり、スーパービューの幅または高さから負の値が差し引かれることでした。しかし、その後、スーパービューの幅と高さを調べたところ、どちらも0.0. 地図と現在地ボタンのフレームと境界の両方に関する情報を出力するコードは次のとおりです。

- (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) この特定のシナリオでビューを適切に配置する方法。この質問への回答を読んだ後、私はビュー フレームと境界を合理的に把握していると思いましたが、これをまだ機能させていないことを考えると、明らかにそうではありません。

4

6 に答える 6

20

これを解決する最も簡単な方法は、マップ ビューを作成した直後にボタンのフレームと自動サイズ変更マスクを変更することです。

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

編集:申し訳ありませんが、ボタンを右上隅に配置しました。左下隅に配置するようにコードを更新しました。

注: 現在、位置情報ボタンを取得するための Google の API はありません。最初の行は、SDK の将来のリリースでは機能しない可能性があります。

また、ここで機能リクエストを作成する必要があります。

もう 1 つのオプションは、自分でボタンを作成し、それをサブビューとしてマップに追加することです。ボタン ハンドラのコードはかなり簡単です。

  CLLocation *location = mapView_.myLocation;
  if (location) {
    [mapView_ animateToLocation:location.coordinate];
  }
于 2013-06-02T08:37:43.000 に答える
6

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 
                    }
                }
            }
        }
    }
于 2016-10-05T14:33:57.513 に答える
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;
            }
        }

    }
};
于 2015-02-10T11:38:04.583 に答える