我希望能够以简单的标签显示设备的行进速度。
我在苹果网站上发现了这个:
var speed:CLLocationSpeed {get}
上面的代码将速度放在m/s
中,因此我可以将其转换为每小时英里数等。
如何使用此代码显示速度?
我知道这可以做到,因为Snapchat将它作为过滤器。
答案 0 :(得分:2)
我在@Leo
上找到了这个import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
locationManager.delegate = self
if NSString(string:UIDevice.currentDevice().systemVersion).doubleValue > 8 {
locationManager.requestAlwaysAuthorization()
}
locationManager.desiredAccuracy=kCLLocationAccuracyBest
}
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
var speed: CLLocationSpeed = CLLocationSpeed()
speed = locationManager.location.speed
println(speed);
}
func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
if status != CLAuthorizationStatus.Denied{
locationManager.startUpdatingLocation()
}
}
}
然后在你的viewDidLoad中,或者在任何地方,你可以制作标签:
myLabel = UILabel()
myLabel.text = "MySpeed: \(speed)"
self.addChild(myLabel)
只要确保'speed'变量在您尝试使用它的任何地方都在范围内(我没有演示)。
它为我编译。希望这可以帮助。我之前没有使用它,但是使用搜索功能我相信我可以在这里学到更多东西:D
答案 1 :(得分:2)
已更新至Swift 4
这可能比您正在寻找的更多,但应该有希望。
import UIKit
import MapKit
import CoreLocation
class TestViewController: UIViewController, CLLocationManagerDelegate {
//MARK: Global Var's
var locationManager: CLLocationManager = CLLocationManager()
var switchSpeed = "KPH"
var startLocation:CLLocation!
var lastLocation: CLLocation!
var traveledDistance:Double = 0
var arrayMPH: [Double]! = []
var arrayKPH: [Double]! = []
//MARK: IBoutlets
@IBOutlet weak var speedDisplay: UILabel!
@IBOutlet weak var headingDisplay: UILabel!
@IBOutlet weak var latDisplay: UILabel!
@IBOutlet weak var lonDisplay: UILabel!
@IBOutlet weak var distanceTraveled: UILabel!
@IBOutlet weak var minSpeedLabel: UILabel!
@IBOutlet weak var maxSpeedLabel: UILabel!
@IBOutlet weak var avgSpeedLabel: UILabel!
//MARK: Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
minSpeedLabel.text = "0"
maxSpeedLabel.text = "0"
// Ask for Authorisation from the User.
self.locationManager.requestAlwaysAuthorization()
// For use in foreground
self.locationManager.requestWhenInUseAuthorization()
if CLLocationManager.locationServicesEnabled() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.startUpdatingLocation()
}
}
// 1 mile = 5280 feet
// Meter to miles = m * 0.00062137
// 1 meter = 3.28084 feet
// 1 foot = 0.3048 meters
// km = m / 1000
// m = km * 1000
// ft = m / 3.28084
// 1 mile = 1609 meters
//MARK: Location
private func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let location = locations.last
if (location!.horizontalAccuracy > 0) {
updateLocationInfo(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude, speed: location!.speed, direction: location!.course)
}
if lastLocation != nil {
traveledDistance += lastLocation.distance(from: locations.last!)
if switchSpeed == "MPH" {
if traveledDistance < 1609 {
let tdF = traveledDistance / 3.28084
distanceTraveled.text = (String(format: "%.1f Feet", tdF))
} else if traveledDistance > 1609 {
let tdM = traveledDistance * 0.00062137
distanceTraveled.text = (String(format: "%.1f Miles", tdM))
}
}
if switchSpeed == "KPH" {
if traveledDistance < 1609 {
let tdMeter = traveledDistance
distanceTraveled.text = (String(format: "%.0f Meters", tdMeter))
} else if traveledDistance > 1609 {
let tdKm = traveledDistance / 1000
distanceTraveled.text = (String(format: "%.1f Km", tdKm))
}
}
}
lastLocation = locations.last
}
func updateLocationInfo(latitude: CLLocationDegrees, longitude: CLLocationDegrees, speed: CLLocationSpeed, direction: CLLocationDirection) {
let speedToMPH = (speed * 2.23694)
let speedToKPH = (speed * 3.6)
let val = ((direction / 22.5) + 0.5);
var arr = ["N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"];
let dir = arr[Int(val.truncatingRemainder(dividingBy: 16))]
//lonDisplay.text = coordinateString(latitude, longitude: longitude)
lonDisplay.text = (String(format: "%.3f", longitude))
latDisplay.text = (String(format: "%.3f", latitude))
if switchSpeed == "MPH" {
// Chekcing if speed is less than zero or a negitave number to display a zero
if (speedToMPH > 0) {
speedDisplay.text = (String(format: "%.0f mph", speedToMPH))
arrayMPH.append(speedToMPH)
let lowSpeed = arrayMPH.min()
let highSpeed = arrayMPH.max()
minSpeedLabel.text = (String(format: "%.0f mph", lowSpeed!))
maxSpeedLabel.text = (String(format: "%.0f mph", highSpeed!))
avgSpeed()
} else {
speedDisplay.text = "0 mph"
}
}
if switchSpeed == "KPH" {
// Checking if speed is less than zero
if (speedToKPH > 0) {
speedDisplay.text = (String(format: "%.0f km/h", speedToKPH))
arrayKPH.append(speedToKPH)
let lowSpeed = arrayKPH.min()
let highSpeed = arrayKPH.max()
minSpeedLabel.text = (String(format: "%.0f km/h", lowSpeed!))
maxSpeedLabel.text = (String(format: "%.0f km/h", highSpeed!))
avgSpeed()
// print("Low: \(lowSpeed!) - High: \(highSpeed!)")
} else {
speedDisplay.text = "0 km/h"
}
}
// Shows the N - E - S W
headingDisplay.text = "\(dir)"
}
func avgSpeed(){
if switchSpeed == "MPH" {
let speed:[Double] = arrayMPH
let speedAvg = speed.reduce(0, +) / Double(speed.count)
avgSpeedLabel.text = (String(format: "%.0f", speedAvg))
//print( votesAvg )
} else if switchSpeed == "KPH" {
let speed:[Double] = arrayKPH
let speedAvg = speed.reduce(0, +) / Double(speed.count)
avgSpeedLabel.text = (String(format: "%.0f", speedAvg))
//print( votesAvg
}
}
//MARK: Buttons
@IBOutlet weak var switchSpeedStatus: UIButton!
@IBAction func speedSwtich(sender: UIButton) {
if switchSpeed == "MPH" {
switchSpeed = "KPH"
switchSpeedStatus.setTitle("KPH", for: .normal)
} else if switchSpeed == "KPH" {
switchSpeed = "MPH"
switchSpeedStatus.setTitle("MPH", for: .normal)
}
}
@IBAction func restTripButton(sender: AnyObject) {
arrayMPH = []
arrayKPH = []
traveledDistance = 0
minSpeedLabel.text = "0"
maxSpeedLabel.text = "0"
headingDisplay.text = "None"
speedDisplay.text = "0"
distanceTraveled.text = "0"
avgSpeedLabel.text = "0"
}
@IBAction func startTrip(sender: AnyObject) {
locationManager.startUpdatingLocation()
}
@IBAction func endTrip(sender: AnyObject) {
locationManager.stopUpdatingLocation()
}
}