旋转Mapbox相机

时间:2019-07-10 00:35:39

标签: ios swift mapbox map-rotation

我正在使用Swift语言的iOS项目中使用Mapbox。我目前正在寻找一种方法,以固定的高度以编程方式在内部具有某些坐标的情况下旋转地图视图。我尝试了很多,甚至还浏览了其API参考,但找不到任何帮助。

有人尝试使用MAPBOX库在MapView连续旋转的同时进行某些操作,以使某些骨胶原保持在边界内。

我们将不胜感激。

2 个答案:

答案 0 :(得分:1)

通过setCamera函数可以传递动画函数。您可以在此处查看此示例:https://docs.mapbox.com/ios/maps/examples/camera-animation/

要限制地图相机的边界,这需要一些技巧,并需要一些计算才能确定相机相对于您要设置的边界的位置。您可以在这里找到一个示例:https://docs.mapbox.com/ios/maps/examples/constraining-gestures/

根据您对问题的表述方式,听起来您需要将这两种方法结合起来。


⚠️免责声明:我目前在Mapbox⚠️

工作

答案 1 :(得分:1)

感谢@riastrad的指导,我提出了很多可以帮助实现此功能的代码。

与所有人共享,以便他们在需要时可以获得帮助:

代码适用于Swift 4.2

//Create a bound using two coordinates.
let coordinateBounds = MGLCoordinateBounds(sw: coordinateOne, ne: coordinateTwo)
//Add Insets for the bounds if needed
let mapEdgeInsets = UIEdgeInsets(top: 10.0, left: 0.0, bottom: 0.0, right: 10.0)
//get the camera that fit those bounds and edge insets
let camera = self.mapView.cameraThatFitsCoordinateBounds(coordinateBounds, edgePadding: mapEdgeInsets)
//Update camera pitch (if required)
camera.pitch = 60
//setup CameraHeading 
let zoomLevel = self.mapView.zoomLevel
var cameraHeading = camera.heading
if zoomLevel > 14 {
    cameraHeading += 2.2
} else {
    cameraHeading += 0.7
}
if cameraHeading > 359 {
    cameraHeading = 1
}
camera.heading = cameraHeading
//set new camera with animation
let newCamera = camera
self.mapView.setCamera(newCamera, withDuration: 0.1, animationTimingFunction: CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut))

将上述代码集放入一个方法中,然后每隔0.1秒重复调用该方法。

private func enableRotationTimer(_ enable:Bool) {
    guard self.store != nil else { return }
    if enable == true {
        if mapRotationTimer == nil {
            mapRotationTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(rotateCamera), userInfo: nil, repeats: true)
        }
    } else {
        mapRotationTimer?.invalidate()
        mapRotationTimer = nil
    }
}

希望这对其他人有帮助。 谢谢