簡體   English   中英

動畫MKMapView攝像頭標題過渡

[英]Animate MKMapView camera heading transition

當userTrackingMode為followWithHeading時,我想要實現的就像mapView中的動畫(地圖如何旋轉)。

問題是我不能在這里使用這種跟蹤模式,因為我們根據不同的位置信息繪制我們自己的藍點,而不是iOS提供的藍點。 每次標題更新時,我都要設置mapView的攝像頭標題值,但要設置動畫以使其平滑。

目前我已經嘗試過:

  1. setCamera: animated:當標題頻繁更改時,這不起作用。
  2. animateWithDuration:animations:completion:這根本不起作用。
  3. 我嘗試了CADisplayLink,如下面的代碼,仍然過渡不順利。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM