[英]Animate MKMapView camera heading transition
當userTrackingMode為followWithHeading時,我想要實現的就像mapView中的動畫(地圖如何旋轉)。
問題是我不能在這里使用這種跟蹤模式,因為我們根據不同的位置信息繪制我們自己的藍點,而不是iOS提供的藍點。 每次標題更新時,我都要設置mapView的攝像頭標題值,但要設置動畫以使其平滑。
目前我已經嘗試過:
setCamera: animated:
當標題頻繁更改時,這不起作用。 animateWithDuration:animations:completion:
這根本不起作用。 CADisplayLink *timer = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateHeading)]; timer.frameInterval = 5; [timer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; [timer addToRunLoop:[NSRunLoop mainRunLoop] forMode:UITrackingRunLoopMode];
在updateHeading
方法中,我只是將mapView的攝像頭設置為當前標題self.camera.heading = newHeading.trueHeading;
我想這不起作用,因為我只在這里每隔5/60秒設置一次相機,這不是動畫。
有人能指出實現這一目標的正確方法嗎? 任何想法將不勝感激。
我有一些運氣使用CADisplayLink,如果你移動一個更大的數量,如170度,它有點慢,但總的來說它運作順利。 我將考慮為它添加一個緩動功能,但暫時它是我見過的最平滑的路線。
private var headingDisplayLink: CADisplayLink?
private var desiredHeading: Double = 0
func locationManager(didUpdateHeading newHeading: CLHeading) {
self.updateHeading(to: newHeading.trueHeading)
}
private func updateHeading(to heading: Double) {
self.desiredHeading = heading.rounded()
if self.headingDisplayLink == nil {
self.headingDisplayLink = CADisplayLink(target: self, selector: #selector(self.headingDisplayLinkUpdate(link:)))
self.headingDisplayLinkUpdate(link: self.headingDisplayLink!)
self.headingDisplayLink?.add(to: RunLoop.main, forMode: .defaultRunLoopMode)
}
}
@objc private func headingDisplayLinkUpdate(link: CADisplayLink) {
if let camera = self.mapView?.camera.copy() as? MKMapCamera {
var delta: Double = self.desiredHeading > camera.heading ? 1 : -1
let difference = fabs(camera.heading - self.desiredHeading)
if difference > 180 {
delta *= -1
}
camera.heading += delta
self.mapView?.setCamera(camera, animated: false)
if camera.heading.rounded() == self.desiredHeading {
self.headingDisplayLink?.invalidate()
self.headingDisplayLink = nil
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.