2016-02-28 10 views
6

Tôi đang viết một ứng dụng và tôi có một bản đồ được nhúng để hiển thị vị trí của người dùng. Đây là mã của tôi cho đến nay:Làm thế nào tôi có thể căn giữa bản đồ vào vị trí của người dùng nhanh chóng?

class YourCurrentLocation: UIViewController, CLLocationManagerDelegate { 

    @IBOutlet weak var mapView: MKMapView! 

    var locationManager = CLLocationManager() 
    let regionRadius: CLLocationDistance = 1000 

    func checkLocationAuthorizationStatus() { 
     if CLLocationManager.authorizationStatus() == .AuthorizedWhenInUse { 
      mapView.showsUserLocation = true 
      centerMapOnLocation(locationManager.location!, map: mapView, radius: regionRadius) 
     } else { 
      locationManager.requestAlwaysAuthorization() //requestWhenInUseAuthorization() 
     } 
    } 



    func centerMapOnLocation(location: CLLocation, map: MKMapView, radius: CLLocationDistance) { 
     let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, 
      radius * 2.0, radius * 2.0) 
     map.setRegion(coordinateRegion, animated: true) 
    } 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     // mapView.delegate = self 


     if CLLocationManager.locationServicesEnabled() 
     { 
      //locationManager = CLLocationManager() 
      locationManager.delegate = self 
      locationManager.requestAlwaysAuthorization() 
      locationManager.desiredAccuracy = kCLLocationAccuracyBest 
      locationManager.startUpdatingLocation() 
      print("location enabled") 
      checkLocationAuthorizationStatus()    
     } 
     else 
     { 
      print("Location service disabled"); 
     } 


     // Do any additional setup after loading the view. 
    } 

} 

Tôi cũng đã thêm hai mục để plist của tôi:

NSLocationAlwaysUsageDescription 
NSLocationWhenInUseUsageDescription 

và cũng trong xcode của tôi, tôi đã từng muốn ganh đua dữ liệu GPS trên london, Vương quốc Anh.

Khi tôi chạy ứng dụng - Tôi thấy bản đồ, nhưng london không được đánh dấu. Tôi đang làm gì sai?

Btw, tôi đã phải nhận xét ra dòng này:

//mapView.delegate = self 

trong viewDidLoad(), nếu không tôi đã có lỗi:

Cannot assign value of type YourCurrentLocation to type MKMapViewDelegate 

và tôi không chắc chắn nếu đó là một phần của vấn đề đây.

Tôi muốn đạt được hiệu quả khi tôi hiển thị bản đồ người dùng và một điểm được đánh dấu trên bản đồ đó với vị trí của anh ấy. Bạn có thể giúp tôi với đó?

+0

'locationManager.location!' Trong mã của bạn sẽ cung cấp cho bạn giả lập hoặc vị trí cuối cùng của thiết bị, có thể là bất kỳ thứ gì. Trong câu trả lời của tôi, tôi chỉ cho bạn cách sử dụng 'CLLocationManagerDelegate' để có được vị trí người dùng thực tế. – paulvs

+0

Được rồi, tôi hiểu ... cảm ơn! một câu hỏi cuối cùng - điều gì sẽ xảy ra trong một tình huống khi điện thoại không ở trong phạm vi GPS hoặc vị trí chưa được phân biệt là thực tế? – user3766930

+0

@ user3766930 bạn có thể đánh dấu câu trả lời là được chấp nhận nếu nó đã giải quyết được sự cố của bạn. – paulvs

Trả lời

13

Sự cố với mã của bạn là bạn đang cố gắng trỏ bản đồ đến vị trí của người dùng khi người dùng cấp quyền vị trí, bạn không chờ đợi CoreLocation để cung cấp cho bạn vị trí thực tế của người dùng. Bạn cần sử dụng phương thức CLLocationManagerDelegatelocationManager(_:didUpdateLocations:) để được thông báo khi bạn nhận được vị trí thực tế của người dùng và ở đó bạn có thể đặt bản đồ để trỏ đến vị trí của người dùng.

class ViewController: UIViewController, CLLocationManagerDelegate { 

    @IBOutlet var mapView: MKMapView! 
    var locationManager: CLLocationManager? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     locationManager = CLLocationManager() 
     locationManager!.delegate = self 

     if CLLocationManager.authorizationStatus() == .AuthorizedWhenInUse { 
      locationManager!.startUpdatingLocation() 
     } else { 
      locationManager!.requestWhenInUseAuthorization() 
     } 
    } 

    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 


     switch status { 
     case .NotDetermined: 
      print("NotDetermined") 
     case .Restricted: 
      print("Restricted") 
     case .Denied: 
      print("Denied") 
     case .AuthorizedAlways: 
      print("AuthorizedAlways") 
     case .AuthorizedWhenInUse: 
      print("AuthorizedWhenInUse") 
      locationManager!.startUpdatingLocation() 
     } 
    } 

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

     let location = locations.first! 
     let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, 500, 500) 
     mapView.setRegion(coordinateRegion, animated: true) 
     locationManager?.stopUpdatingLocation() 
     locationManager = nil 
    } 

    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) { 
     print("Failed to initialize GPS: ", error.description) 
    } 
} 
+0

ok, tôi thấy bạn cắt mã của tôi rất nhiều, không phải là phần còn lại của dòng mã cần thiết? – user3766930

+0

btw, có cách nào để hiển thị ghim màu đỏ trên bản đồ trên vị trí chính xác của người dùng không? cho đến nay tôi chỉ có thể nhìn thấy khu vực chính xác .. – user3766930

+1

Đặt 'kCLLocationAccuracyBest' là không cần thiết vì nó là giá trị mặc định theo tài liệu, mặc dù không có hại trong cài đặt nó. Tôi cũng đã cập nhật việc kiểm tra 'authorizationStatus' của' CoreLocation'. – paulvs

Các vấn đề liên quan