iOS locationManager - 汽车仪表延迟

标签 ios objective-c iphone xcode swift

我正在尝试制作一款可以在仪表(例如汽车)上显示您的速度(速度)的应用。 我遇到的问题是 CLlocationManager 委托(delegate)方法 didUpdateLocations 每秒只让我读取一次位置和速度,所以如果我加速汽车太快,我会延迟仪表上的指针位置。 例如:我得到 13 m/s 的速度,一秒钟后我得到 26 m/s,因此 UI 中的指针变为 13 m/s 并在那里等待一秒钟,然后才变为 26 m/s。所以我在 UI 中得到了非连续的指针移动。

通过阅读其他问题,我了解到我无法控制从 CLlocation 获得的采样率,并且我无法告诉他每 0.25 秒(使用不同的值)给我一次读取。 1.是真的吗? 2. 我该如何解决才能让用户看起来不错?

//in viewdidload:
    self.locationManager.delegate = self
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
    self.locationManager.distanceFilter = kCLDistanceFilterNone

    if versionNum == 8 {
        self.locationManager.requestAlwaysAuthorization()
    }

    self.locationManager.startUpdatingLocation()

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
    println(locations)

    var loc = locations.last as! CLLocation
    var speed = loc.speed

    var time = loc.timestamp

    var hour = getCurrentHour(time)
    println("hour inside manager: \(hour)")
    if hour == 18 && self.isItDay {
        self.currentTimeHour = hour
        self.setDayBool()
        self.setRightImg()
    }
    else if hour == 6 && !self.isItDay {
        self.currentTimeHour = hour
        self.setDayBool()
        self.setRightImg()
    }

    if self.unit == "MPH" {
        speed = speed * 3.280839895013123
    }

    if speed >= 0 {
        self.speedLabel.text = "\(Int(speed))"
        self.animateNeedle(CGFloat(speed))
    }

    println("speed: \(speed)")

}
func animateNeedle(speed : CGFloat) {

    var rotation : CGFloat = 0

    if self.unit == "KMH" {
        rotation = (speed * 4) - 5
    }
    else if self.unit == "MPH" {
        rotation = speed + ((speed / 3) - 5)
    }

    if let trans = self.needleImg.layer.presentationLayer() {
        self.currentValue = self.needleImg.layer.presentationLayer().valueForKeyPath("transform.rotation") as! Float
    }

    println(currentValue)

    let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation")
    rotateAnimation.fillMode = kCAFillModeBoth
    rotateAnimation.removedOnCompletion = false
    rotateAnimation.fromValue = currentValue
    rotateAnimation.toValue = self.degToRad(rotation)
    rotateAnimation.duration = 0.3
    self.needleImg.layer.addAnimation(rotateAnimation, forKey: "transform.rotation")
}

最佳答案

正如 Lefteris 所说,您应该将距离过滤器设置为 0。您还应该选择 kCLLocationAccuracyBest 作为位置管理器的 desiredAccuracy 属性。

iOS GPS 在任何情况下都相当粗糙,所以我怀疑这些东西中的任何一个是否会有很大帮助。

我建议将速度计指针从旧位置设置为新位置的动画。 0.2 - 0.3 秒的持续时间应该足以产生运动的印象,而不会花费太长时间以干扰保持针位置当前。

您可以使用 UIView 动画方法,例如 animateWithDuration:animations 或 Core Animation。 Core Animation 更难使用,但提供了更多选项。

关于iOS locationManager - 汽车仪表延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30347389/

相关文章:

ios - 在 swift 3 中使用解析中的 AnyObject 类型和访问对象

ios - 文字转语音 : highlighting word by word for iphone

IOS - 如何以编程方式阻止从另一个应用程序打开一个应用程序?

objective-c - NSCondition -> Objective-C

javascript - 移动网络应用程序上的语音记录

ios - 如何将 CIFilter 应用于 UIImage?

ios - 由于 pod 安装的主要版本更新,停止重新创建 CocoaPods

ios - sip header 联系私有(private)ip。可以吗?

ios - 旋转后如何调整相机纵横比?

ios - 带有核心数据的慢速 UISearchDisplayController