谷歌地图代表

Posted

技术标签:

【中文标题】谷歌地图代表【英文标题】:Google Maps Delegate 【发布时间】:2020-06-30 00:34:45 【问题描述】:

我在我的项目中使用谷歌地图。我想在点击调用委托方法的 infoWindowOfMarker 时为用户提供 2 个选项:mapView(_ mapView: GMSMapView, didTapInfoWindowOfMarker marker: GMSMarker)

如果我只想执行一项操作,我可以检索标记中的信息并执行我的操作。实际上我想给用户 2 个选项:查看详细信息(这会将用户发送到新的视图控制器)和访问(它将根据标记的位置属性和用户的当前位置从 google apis 获取方向) 这两个选项将是两个按钮。

我不知道如何将标记参数传递给点击按钮时调用的方法。

查看代码,请告诉我任何其他方法可以做到这一点。

class ItemMarker: GMSMarker 
    let item: Item
    init(item: Item)
        self.item = item
        super.init(position: item.coordinate)
        //and necessary initialization
    

class MapViewController: GMSMapViewDelegate
    @IBOutlet weak var actionStackView: UIStackView!
    @IBoutlet weak var mapView: GMSMapView!
    var currentUser: User!
    var users = [User]()
    var items = [Item]()
    override viewDidLoad()
        super.viewDidLoad()
        //implement code for mapView
        self.currentUser = UserManager.shared.currentUser
        self.users = UserManager.shared.users
        users.forEach self.items.append(contentOf: $0.items
        self.items.forEach let marker = ItemMarker(item: $0)
            marker.map = mapView
    

    @objc func seeDetailButtonTapped(_ sender: UIButton)
        //here I want to verify if the user is the owner of the item he wants to see the detail,
        //then allow him to modify it and present the new view controller modally.
        //if the user is not the owner, then not allowing editing, and show the new view controller.
        //i guess for that I need to be able to have the marker for that.
    

    @objc func visitButtonTapped(_ sender: UIButton) 
        //here I want to use the user current location,
        //the item location, get the directions for the user,
        //I need the ItemMarker to do that.
    

    func mapView(_ mapView: GMSMapView, didtapInfoWindowOfMarker marker: GMSMarker)
    
        let visitButton = UIButton(type: .roundedRect)
        visitButton.setTitle(Utilities.visit, for: .normal)
        visitButton.backgroundColor = UIColor.systemBlue
        visitButton.addTarget(self, action: #selector(visitButtonTapped(_:)), for: .touchUpInside)
        let seeDetail = UIButton(type: .roundedRect)
        seeDetail.setTitle(Utilities.detail, for: .normal)
        seeDetail.backgroundColor = UIColor.systemGray
        seeDetail.addTarget(self, action: #selector(showDetailHouse(_:)), for: .touchUpInside)
        actionStackView.addArrangedSubview(visitButton)
        actionStackView.addArrangedSubview(seeDetail)
        let stackViewHeight = actionStackView.intrinsicContentSize.height
        let topInset = self.mapView.safeAreaInsets.top
        mapView.padding = UIEdgeInsets(top: topInset, left: 0.0, bottom: stackViewHeight, right: 0.0)
        UIView.animate(withDuration: 0.25) 
            actionStackView.bottomAnchor.constraint(equalTo: self.mapView.safeAreaLayoutGuide.bottomAnchor, constant: 2.0).isActive = true
            actionStackView.alpha = 0.9 
    

如何将标记传递给 seeDetail 方法和 visitButtonTapped 方法? ????

【问题讨论】:

【参考方案1】:

从 UIButton 创建一个具有所需属性的子类,然后您可以在 tap 处理程序中使用它。

class UIButtonWithMarker: UIButton 
    var itemMarker: ItemMarker?


func mapView(_ mapView: GMSMapView, didtapInfoWindowOfMarker marker: GMSMarker)

    let visitButton = UIButtonWithMarker(type: .roundedRect)
    visitButton.itemMarker = marker as? ItemMarker
    visitButton.setTitle(Utilities.visit, for: .normal)
    visitButton.backgroundColor = UIColor.systemBlue
    visitButton.addTarget(self, action: #selector(visitButtonTapped(_:)), for: .touchUpInside)

    let seeDetail = UIButtonWithMarker(type: .roundedRect)
    seeDetail.itemMarker = marker as? ItemMarker
    seeDetail.setTitle(Utilities.detail, for: .normal)
    seeDetail.backgroundColor = UIColor.systemGray
    seeDetail.addTarget(self, action: #selector(showDetailHouse(_:)), for: .touchUpInside)


@objc func seeDetailButtonTapped(_ sender: UIButtonWithMarker)
    if itemMarker = sender.itemMarker 
        //use itemMarker here
    


@objc func visitButtonTapped(_ sender: UIButtonWithMarker) 
    if itemMarker = sender.itemMarker 
        //use itemMarker here
    

【讨论】:

非常感谢?!尊重✊

以上是关于谷歌地图代表的主要内容,如果未能解决你的问题,请参考以下文章

更改谷歌地图当前位置蓝点颜色 iOS

仅在设备屏幕的特定部分显示谷歌地图折线

带有谷歌地图扩展的伪造查看器

谷歌地图怎么使用

怎么使用谷歌地图

为啥手机上不能用谷歌地图