如何禁用动画以更改iOS中的GMSMarker位置?

时间:2016-10-25 14:54:21

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

根据documentation,您可以使用动画更改标记位置:

  

标记位置。   动画。

你知道怎么禁用这个动画吗?

3 个答案:

答案 0 :(得分:7)

假设您对标记的引用为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
}

这会在没有动画的情况下更改标记的位置。

答案 1 :(得分:1)

另一种肮脏又棘手的解决方法,而无需重新创建标记:

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不会改变。

答案 2 :(得分:1)

如在Google地图示例中所实现的,您应为此目的使用CATransaction

let changedPosition = CLLocationCoordinate2DMake(22.9734, 78.6569)
CATransaction.begin()
CATransaction.setAnimationDuration(0.0)
marker.position = changedPosition
CATransaction.commit()

Source演示。