使用CLLocationSpeed显示设备的行进速度

时间:2016-08-23 19:28:20

标签: swift core-location cllocationmanager

我希望能够以简单的标签显示设备的行进速度。

我在苹果网站上发现了这个:

  

var speed:CLLocationSpeed {get}

source

上面的代码将速度放在m/s中,因此我可以将其转换为每小时英里数等。

如何使用此代码显示速度?

我知道这可以做到,因为Snapchat将它作为过滤器。

2 个答案:

答案 0 :(得分:2)

我在@Leo

上找到了这个

Swift: Exception while trying to print CLLocationSpeed "unexpectedly found nil while unwrapping an Optional value"

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()
    }
}