核心位置返回0作为高度

时间:2016-12-05 15:06:08

标签: swift swift3 core-location

看这里Finding Altitude in Swift 看看我的代码

import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    @IBOutlet weak var lbl: UILabel!
    var player: AVAudioPlayer?

    var locationManager:CLLocationManager = CLLocationManager()

    var alt: Double?

    @IBOutlet weak var coor: UILabel!

    func locationManager(manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!) {
        alt = newLocation.altitude
        var altitude = locationManager.location?.altitude
        print("\(altitude)")
        manager.stopUpdatingLocation()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.locationManager = CLLocationManager()
        locationManager.requestWhenInUseAuthorization()
        self.locationManager.delegate = self
        self.locationManager.distanceFilter = kCLDistanceFilterNone
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        self.locationManager.startUpdatingLocation()
    }

    @IBAction func getCoor(_ sender: Any) {
        var altitude = locationManager.location?.altitude
        coor.text = "\(altitude)"
    }
}

为什么它不显示实际的海拔高度而是显示0.0?

2 个答案:

答案 0 :(得分:0)

这种代码注定要失败:

func locationManager(manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!) {
    // ...
    manager.stopUpdatingLocation()
}

使用startUpdatingLocation启动了位置管理员后,您就会在第一次调用didUpdateLocation时停止位置管理员。但是第一次打电话总是假的,甚至接下来的十几个电话也可能只是热身,因为硬件得到了修复。

如果您的问题是“我在哪里”,请使用requestLocation,而不是startUpdatingLocation。它仅调用didUpdateLocation一次,并且只有当 实际上具有足够好的位置时(可能需要一些时间)。

最后,请注意您的代码在Swift 3中不正确。locationManager(manager:...) 永远不会被调用。 Read the docs了解正确的签名。

答案 1 :(得分:0)

您将newlocation.altitude存储到“alt”变量中,但打印“altitude”。

尝试:print("\(alt)")