iOS模拟器中当前位置未显示

3

我正在尝试在一个MKMapView中展示用户的当前位置,mapView。我已经请求了权限并且认为我已经做好了所有准备工作,但是由于某些原因,当前位置没有显示在地图上。

以下是代码。不要在意分段控件,我只是用它们来改变地图类型。

import UIKit
import MapKit

let annotationId = "annotationID";

class ViewController: UIViewController, CLLocationManagerDelegate {

@IBOutlet weak var mapView: MKMapView!
@IBOutlet weak var segControls: UISegmentedControl!

let locationManager = CLLocationManager();
var zoomToUserLocation = false;

// Switch statements for the seg controls.

@IBAction func mapType(sender: UISegmentedControl) {
    switch segControls.selectedSegmentIndex {
    case 0:
        mapView.mapType = MKMapType.Standard
    case 1:
        mapView.mapType = MKMapType.Satellite
    case 2:
        mapView.mapType = MKMapType.Hybrid
    default:
        mapView.mapType = MKMapType.Standard 
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    // We are setting the delegate equal to self here to be able to use the indentifier that deques the annotations.
    locationManager.delegate = self

    // Status of user is variable that speaks directly to (in this case) authorization status
    let status = CLLocationManager.authorizationStatus()

    if status == CLAuthorizationStatus.NotDetermined {
        locationManager.requestWhenInUseAuthorization()
    } else if  status != .Denied {
        locationManager.startUpdatingLocation()
    }

    // let annotation = MKPointAnnotation();
}

// If the status changes to authorize when in use or always authorize
// then start updating the location, if not don't do anything.

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    if status == CLAuthorizationStatus.AuthorizedWhenInUse || status == CLAuthorizationStatus.AuthorizedAlways {
        locationManager.startUpdatingLocation()
    }
}

// If the location failed when trying to get users location execute this function
func  locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
    println("Error: \(error)")
    }
}

extension ViewController: MKMapViewDelegate {
    func mapView(mapView: MKMapView!, didUpdateUserLocation userLocation: MKUserLocation!) {

    let coordinate = userLocation.coordinate; // this sets the var coordinates to the location of the user.

    println("User Location = (\(coordinate.latitude), \(coordinate.longitude))");

    if zoomToUserLocation == true {
        let locationOfDevice: CLLocation = userLocation.location // this determines the location of the device using the users location

        let deviceCoordinate: CLLocationCoordinate2D = locationOfDevice.coordinate // determines the coordinates of the device using the location device variabel which has in it the user location.

        let span = MKCoordinateSpan(latitudeDelta: 1, longitudeDelta: 1) // this determines the span in which its determined that 1 degree is 69 miles.

        let region = MKCoordinateRegion(center: deviceCoordinate, span: span) // set the center equal to the device coordinates and the span equal to the span variable we have created this will give you the region.

        mapView.setRegion(region, animated: true);
    } 
}
}
2个回答

4
你需要将MKMapView的showsUserLocation属性设置为true。这是一个布尔属性,它将显示当前位置(即您提到的那个脉冲蓝点 - 可以着色并且不总是蓝色)。
以下是苹果在其文档中对此进行总结的方式。
这个属性不表示用户的位置实际上是否在地图上可见,只表示地图视图是否应该尝试显示它。将此属性设置为true会导致地图视图使用核心定位框架找到当前位置并尝试在地图上显示它。只要此属性为true,地图视图就会继续跟踪用户的位置并定期更新它。默认值为false
显示用户位置并不能保证位置在地图上可见。用户可能已经将地图滚动到不同的点,导致当前位置离屏幕外。要确定用户的当前位置是否在地图上显示,请使用userLocationVisible属性。
因此,在您的viewDidLoad函数中,您应该设置此属性:
mapView.showsUserLocation = true

“zoomToUserLocation”属性不控制当前位置的点。

0
有时候你需要先设置一个自定义位置,才能让模拟器更新并实际设置位置(不知道为什么)。我的做法是先去 Debug->Location->Apple 检查地图位置是否正常工作。然后再从谷歌地图或类似的应用中获取坐标,设置自定义位置。

谢谢。我在多次尝试使用“Apple”位置失败后,将位置更改为自定义。然而,它仍然无法正常工作。 - Antonio Lipiz
好的,看看@Sam的回复,那应该能解决你的问题 :) - tskulbru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接