【问题标题】:Any better way to handle overwhelming heading data from CLLocationManager to present on UI?有没有更好的方法来处理来自 CLLocationManager 的大量航向数据以呈现在 UI 上?
【发布时间】:2017-04-30 09:44:41
【问题描述】:

我可以从 CLLocationManager 获取 Heading 数据。

    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.headingFilter = 0.2
    locationManager.headingOrientation =  CLDeviceOrientation.landscapeRight
    locationManager.startUpdatingHeading()
    locationManager.delegate = self

我可以使用

func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
    let headingDegree = newHeading.trueHeading
    // Keep update CALayer
    scrollLayer.scroll(to: CGPoint(x: headingDegree, y: 20.0))
}

更新用户界面。 UI 是 CAScrollLayer 顶部的标题点击。

问题:

当 iPhone 偏航过快时,航向磁带会一直抖动。我认为滚动活动不够快,无法处理大量的标题数据。

问题:

有没有更好的方法来使用 CAScrollLayer 处理航向更新数据?

【问题讨论】:

    标签: ios swift calayer cllocationmanager


    【解决方案1】:

    听起来您需要进行一些平滑处理。需要明确的是,平滑(以最基本的形式)是随着时间的推移取平均值。假设您想取最近 60 次左右更新的平均值,那么您将拥有一个用于计算平均值的值数组:

    var arr: [Double] = []
    
    func average(latestVal: Double) -> Double
    {
        if arr.count >= 60 {
            arr.remove(at: 0)
        }
        arr.append(latestVal)
    
        let total = arr.reduce(0, { $0 + $1 })
    
        return total / Double(arr.count)
    }
    

    这确实是在 Swift 中实现队列的绝佳机会,您可以在 here 上找到详细信息。

    【讨论】:

      猜你喜欢
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 2013-01-01
      相关资源
      最近更新 更多