我正在尝试制作一款可以在仪表(例如汽车)上显示您的速度(速度)的应用。 我遇到的问题是 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/