我已经在我的项目中包含了谷歌地图视图,并成功地在上面显示了标记。谷歌地图只提供标记的弹出动画。我想要为标记放置动画。
我已经成功地实现了半径动画放大和缩小,但需要标记放置动画。
所以我的想法是,如果我把标记的确切点放进UIScreen,然后我会把别针从屏幕顶部掉下来,这会产生掉落动画的效果。
最后我从下面的代码中得到了drop动画,但有一个问题,我没有从mapview中得到完美的点来显示drop动画。
//Drop pin
func setMarker(latitude : Double, longitude : Double, isForJobLocation : Bool = false){
let point = mapView.projection.point(for: CLLocationCoordinate2D(latitude: latitude, longitude: longitude))
let viewPoints = UIApplication.shared.keyWindow!.convert(point, from: mapView)
print(viewPoints)
self.showAnimatation(xPosition: viewPoints.x, yPosition: viewPoints.y) {
let marker1 = GMSMarker(position: CLLocationCoordinate2D(latitude: latitude, longitude: longitude))
marker1.icon = UIImage(named: "mapLoadingPin")
marker1.map = self.mapView
}
}
func showAnimatation(xPosition : CGFloat, yPosition : CGFloat, completion : @escaping (() -> ())){
let imageView = UIImageView(frame: CGRect(x: xPosition, y: yPosition - 100, width: 44, height: 44))
imageView.image = UIImage(named: "mapLoadingPin")
self.view.addSubview(imageView)
UIView.animate(withDuration: 1.0, animations: {
imageView.frame.origin.y = yPosition
self.view.layoutIfNeeded()
}) { (true) in
imageView.removeFromSuperview()
completion()
}
}
请帮帮我。任何帮助都将不胜感激。
我在您的代码中看到两个问题:
-
将CGPoint从mapView转换为keyWindow的坐标系。但是,您使用为窗口计算的CGPoint将imageView添加到视图中。
-
您没有考虑imageViews的大小。我想你的标记图像应该水平居中放置在地图上的点上方。(但这取决于标记图像的设计(
以下更改应该可以解决您的问题:
-
将GMS标记原点转换为imageView的parentView的坐标系。更换
let viewPoints = UIApplication.shared.keyWindow!.convert(point, from: mapView)
带有
let viewPoints = self.view.convert(point, from: mapView)
-
考虑imageViews的大小。imageView的原点(动画之后的(应该是(xPosition-imageView.width/2,yPosition-imageView.height(。在您的示例中,替换
let imageView = UIImageView(frame: CGRect(x: xPosition, y: yPosition - 100, width: 44, height: 44))
带有
let imageView = UIImageView(frame: CGRect(x: xPosition - 22, y: yPosition - 44 - 100, width: 44, height: 44))
如果这不能解决您的问题,请帮助我们提供一张显示错位图像的屏幕截图Views来帮助您。
我已经测试了您的代码,您的问题是将origin.y
用于imageView框架。
指定矩形原点坐标的点。
根据Apple文档,origin在某种程度上代表CGRect的minX和minY。所以,你应该重构你的位置:
imageView.frame.origin.y = yPosition - imageView.bounds.height