我正在使用Google地图构建一个项目,并尝试在选中时为地图标记设置动画(在附加图像上看起来像这样)。
它看起来更像是将地图标记转换为infoWindow,这有可能吗?我知道iconView
上有一个GMSMarker
属性,这可能是UIView
的动画,但我担心从标记本身调用其他动作可能会有问题。
我是否应该为该标记提供infoWindow,该标记将覆盖标记本身,然后为infoWindow设置动画或是否还有其他解决方案?
答案 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
}
}