我试图在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);
}
}
}
答案 0 :(得分:3)
您需要将MKMapView的showsUserLocation
属性设置为true
。它是一个布尔属性,将显示当前位置(您引用的脉冲蓝点 - 可以着色并且不总是蓝色)。
以下是Apple如何在documentation
中总结一下此属性不指示用户的位置是否在地图上实际可见,仅指示地图视图是否应尝试显示它。将此属性设置为
true
会导致地图视图使用Core Location框架查找当前位置并尝试在地图上显示它。只要此属性为true
,地图视图就会继续跟踪用户的位置并定期更新。此属性的默认值为false
。显示用户的位置并不能保证该位置在地图上可见。用户可能已将地图滚动到不同的点,导致当前位置在屏幕外。要确定用户当前位置当前是否显示在地图上,请使用
userLocationVisible
属性。
因此,在viewDidLoad
函数中,您应该设置此属性:
mapView.showsUserLocation = true
zoomToUserLocation
属性不控制当前位置点。
答案 1 :(得分:0)
有时您需要首先设置自定义位置以使模拟器更新并实际设置位置(不知道为什么)。我所做的是转到Debug->Location->Apple
只是为了检查地图位置的内容是否真的有效。然后我设置了一个自定义位置,其中包含我从谷歌地图或类似地方找到的坐标。