【发布时间】:2016-10-25 14:54:20
【问题描述】:
【问题讨论】:
-
有点骇人听闻。检查我的答案
标签: ios swift google-maps google-maps-sdk-ios
【问题讨论】:
标签: ios swift google-maps google-maps-sdk-ios
假设您对标记的引用是 mainMarker,这是一个 GMSMarker 对象
var mainMarker:GMSMarker?
假设这是您在没有动画的情况下更改标记位置的功能
func changeMarkerWithoutAnimation() {
mainMarker?.map = nil
mainMarker = nil
let changedPosition = CLLocationCoordinate2DMake(22.9734, 78.6569)
mainMarker = GMSMarker(position: changedPosition)
mainMarker?.title = "Hello World"
mainMarker!.map = mapView
}
这将在没有动画的情况下更改标记的位置。
【讨论】:
CoreAnimation 来实现这一点,而不是让你的标记为零。检查这个stackoverflow.com/a/19128891/2545465 即使是谷歌地图也为此目的提供了一个方法markerWithPosition:
didUpdateLocation。无论您走到哪里,都可以将标记动画到您的新坐标。只需提供标记新坐标,我猜默认情况下它会在谷歌地图中动画到该位置
正如在谷歌地图示例中实现的那样,您应该为此使用CATransaction。
let changedPosition = CLLocationCoordinate2DMake(22.9734, 78.6569)
CATransaction.begin()
CATransaction.setAnimationDuration(0.0)
marker.position = changedPosition
CATransaction.commit()
Source 演示。
【讨论】:
另一个不重新创建标记的肮脏和hacky解决方法:
extension GMSMarker
{
func moveWithoutAnimation(_ newPosition: CLLocationCoordinate2D)
{
guard let map = map else {
return
}
let oldPoint = map.projection.point(for: position)
let newPoint = map.projection.point(for: newPosition)
let delta = CGPoint(x: newPoint.x - oldPoint.x, y: newPoint.y - oldPoint.y)
let width = iconView?.width ?? icon?.size.width ?? 26
let height = iconView?.height ?? icon?.size.height ?? 41
let deltaInPercentage = CGPoint(x: 0.5 - delta.x/width, y: 0.5 - delta.y/height)
groundAnchor = deltaInPercentage
}
}
注意,实际的marker.position 不会改变。
【讨论】: