在Swift iOS上的Google地图上选择动画地图标记

时间:2018-02-21 15:27:37

标签: ios swift google-maps google-maps-markers google-maps-sdk-ios

我正在使用Google地图构建一个项目,并尝试在选中时为地图标记设置动画(在附加图像上看起来像这样)。

marker small marker big

它看起来更像是将地图标记转换为infoWindow,这有可能吗?我知道iconView上有一个GMSMarker属性,这可能是UIView的动画,但我担心从标记本身调用其他动作可能会有问题。

我是否应该为该标记提供infoWindow,该标记将覆盖标记本身,然后为infoWindow设置动画或是否还有其他解决方案?

1 个答案:

答案 0 :(得分:1)

我使用MapKit做了类似的动画。 在版本1.13以后的GoogleMaps SDK上,如果我没有错,你可以采用与MapKit类似的方法。

您有一个名为iconView的属性,并且您具有(几乎)与UIView相同的功能。

iconView属性支持UIView 除帧和中心之外的所有可动画属性的动画。

由于这个限制,我不得不使用iconView中的动画视图制作技巧。 此外,要使动画视图的开头居中,您必须具有双倍大小的iconView,因此如果您有太多标记,则可能是一个大问题。

我好奇地对你的问题做了一个示例代码。

在下面的代码中,您可以自定义markerView功能,以便在标记视图中显示按钮,图标和所需的全部内容。

import UIKit
import GoogleMaps

class MapViewController: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()

        // Create a GMSCameraPosition that tells the map to display the
        // coordinate -33.86,151.20 at zoom level 6.
        let camera = GMSCameraPosition.camera(withLatitude: -33.86, longitude: 151.20, zoom: 14.0)
        let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
        mapView.camera = camera
        mapView.delegate = self
        self.view = mapView
        // Creates a marker in the center of the map.
        let marker = GMSMarker()
        marker.iconView = markerView()
        marker.position = CLLocationCoordinate2D(latitude: -33.86, longitude: 151.20)
        marker.title = "Sydney"
        marker.snippet = "Australia"
        marker.map = mapView
        // Do any additional setup after loading the view.
    }

    func markerView() -> UIView {
        let backView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 30))

        let markerView = UIView(frame: CGRect(x: 85, y: 0, width: 30, height: 30))
        let labelName = UILabel(frame: CGRect(x: 30, y: 0, width: 70, height: 30))
        markerView.clipsToBounds = true
        labelName.text = "Yyaaaa"
        labelName.textColor = .white
        markerView.addSubview(labelName)
        markerView.backgroundColor = .blue
        markerView.layer.cornerRadius = 15
        markerView.tag = 1
        backView.addSubview(markerView)
        return backView
    }
}

extension MapViewController: GMSMapViewDelegate {
    func mapView(_ mapView: GMSMapView, markerInfoWindow marker: GMSMarker) -> UIView? {
        let backView = marker.iconView
        if let subViews = backView?.subviews {
            for view in subViews {
                if view.tag == 1 {
                    UIView.animate(withDuration: 0.5, animations: {
                      view.frame = CGRect(x: 85, y: 0, width: 115, height: 30)
                    })
                }
            }
        }
        return nil
    }
}