如何使用Swift更改谷歌地图中“我的位置”按钮的位置

23

我的位置按钮

我在我的项目中使用Google地图,我想把我的位置按钮往上移一点,我应该如何使用Swift实现?


1
@ Amma teja:我认为你无法改变我的位置按钮的位置,但你可以创建自己的按钮并将其设置为任何框架。 - Developer
6个回答

45

您可以通过设置地图视图的填充来更改地图控件的位置。

 let mapView = GMSMapView()

 mapView.isMyLocationEnabled = true
 mapView.settings.myLocationButton = true

 mapView.padding = UIEdgeInsets(top: 0, left: 0, bottom: 50, right: 50)

е®ғдјҡж”№еҸҳвҖңжҲ‘зҡ„дҪҚзҪ®вҖқжҺ§д»¶зҡ„еЎ«е……гҖӮд»Һеә•йғЁ50еғҸзҙ е’ҢеҸідҫ§50еғҸзҙ гҖӮ

иҜ·еҸӮиҖғдёӢйқўзҡ„еұҸ幕жҲӘеӣҫпјҢе®ғж·»еҠ дәҶжқҘиҮӘеә•йғЁе’ҢеҸідҫ§еҗ„50еғҸзҙ зҡ„еЎ«е……гҖӮ

иҫ“е…ҘеӣҫеғҸжҸҸиҝ°


2
但是,正如您所看到的,当前位置的位置也会发生变化,但我想在将myLocationButton向上移动时保持当前位置的中心位置。请问我该怎么做? - Arafin Russell
2
@subramanian:这里有一个小问题,我只想改变我的位置按钮的位置,而不是“Google”文本。 - Bhanuteja
当您更改位置按钮并按下该按钮时,当前位置将不会居中显示。 - Hardik1344
如何启用地图工具栏...? - Jose Tovar
我们可以隐藏这个按钮吗? - Taimur Ajmal

7

针对Swift 4的更新:仅修改“我的位置”按钮的位置即可。

for object in self.mapView.subviews{
            if(object.theClassName == "GMSUISettingsPaddingView"){
                for view in object.subviews{
                    if(view.theClassName == "GMSUISettingsView"){
                        for btn in view.subviews{
                            if(btn.theClassName == "GMSx_QTMButton"){
                                var frame = btn.frame
                                frame.origin.y = frame.origin.y - 100
                                btn.frame = frame

                            }
                        }
                    }
                }
            }
        }

    public extension NSObject {
    public var theClassName: String {
        return NSStringFromClass(type(of: self))
    }
}

6

像 Subramanian 一样,这非常有效:

mapView.padding = UIEdgeInsets(top: 0, left: 0, bottom: 50, right: 0)

如果您的应用程序中有导航栏,则这非常完美。


3

这是我为Google Maps SDK 5.1.0编写的函数,因为按钮的类名已更改为 'GMSx_MDCFloatingButton',以防有人需要更新的方法。

另外,根据您的实现,您可能希望在viewDidAppear()上调用此函数。

func moveLocationButton(){
        for object in self.googleMapsView!.subviews{
            if(object.thisClassName == "GMSUISettingsPaddingView"){
                for view in object.subviews{
                    if(view.thisClassName == "GMSUISettingsView"){
                        for btn in view.subviews{
                            if(btn.theClassName == "GMSx_MDCFloatingButton"){
                                var frame = btn.frame
                                frame.origin.x = frame.origin.x - 50
                                frame.origin.y = frame.origin.y - 150
                                btn.frame = frame
                                
                            }
                        }
                    }
                }
            }
        }
    }

    public extension NSObject {
    var thisClassName: String {
        return NSStringFromClass(type(of: self))
       }
    }

1
在“viewDidAppear”中调用它会导致按钮跳动。因此,我在“viewDidLoad”中稍微延迟调用了它:“DispatchQueue.main.asyncAfter(deadline: .now() + 0.1)” - Starwave

0
我建议通过调整约束来改变按钮位置,而不是更改frame.origin。 我通过将frame.origin放置在viewDidAppear中来使其工作。 没有正确的方法可以从viewWillApperviewWillLayoutSubviews中调用。 但是,我成功地从viewDidLoad中调用约束更改来使其完美运作。 我使用了snapkit,但使用本地方法也不是什么大问题。
private func changeCurrentLocationButtonPosition(of mapView: GMSMapView) {
    for object in mapView.subviews where object.theClassName == "GMSUISettingsPaddingView" {
        for view in object.subviews where view.theClassName == "GMSUISettingsView" {
            for btn in view.subviews where btn.theClassName == "GMSx_MDCFloatingButton" {
                btn.snp.makeConstraints({ maker in
                    maker.left.equalToSuperview().offset(15)
                })
                btn.snp.makeConstraints({ maker in
                    maker.bottom.equalToSuperview().offset(-30)
                })
                return
            }
        }
    }
}

-1
使用此函数,并在 viewDidLayoutSubviews() 中调用它。
func changeLocationBtnFrame(){
    self.mapView.settings.myLocationButton = true
    for obj in self.mapView.subviews{
        if String(describing: obj.classForCoder) == "GMSUISettingsPaddingView"{
            for viw in obj.subviews{
                if String(describing: viw.classForCoder) == "GMSUISettingsView"{
                    for btn in viw.subviews{
                        if String(describing: btn.classForCoder) == "GMSx_MDCFloatingButton"{
                            var frame = btn.frame
                            
                            btn.frame = CGRect(x: 316, y: 0, width: 56, height: 56)
                            //USE you want frame this line
                            break
                        }
                    }
                    break
                }
            }
            break
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接