2016-02-28 3 views
6

私はアプリを書いています。ユーザーの現在地を表示するために埋め込まれたマップビューがあります。これは、これまでの私のコードです:どのように地図をユーザーの場所に迅速に配置できますか?

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. 
    } 

} 

私はまた私のplistに2つのエントリを追加しました:

NSLocationAlwaysUsageDescription 
NSLocationWhenInUseUsageDescription 

とも私のXcodeで、私はロンドン、英国でのGPSデータをエミュレートするように設定されています。

アプリを実行すると、地図が表示されますが、ロンドンにはマークが付きません。私は間違って何をしていますか?それ以外の場合は、私がエラーだった、viewDidLoad()

//mapView.delegate = self 

ところで、私はこの行をコメントアウトしなければならなかった

Cannot assign value of type YourCurrentLocation to type MKMapViewDelegate 

をし、私はそれが問題の一部だのかはわかりませんここに。

私はユーザーマップと彼の場所でそのマップ上にマークされたポイントに表示するときに効果を達成したいと思います。あなたはそれで私を助けることができますか?

+0

あなたのコードの 'locationManager.location!'は、シミュレータまたはデバイスの最後の場所を提供します。これは何でもかまいません。私の答えでは、 'CLLocationManagerDelegate'を使って実際のユーザの場所を取得する方法を示します。 – paulvs

+0

さて、私は見る...ありがとう! 1つの最後の質問 - 電話機がGPS圏内にいないか、またはその場所が実際のものと区別されていない状況ではどうなりますか? – user3766930

+0

@ user3766930あなたの問題を解決した場合は、回答を受け入れ可能とマークすることができます。 – paulvs

答えて

13

コードに問題があると、ユーザーが場所の許可を得たときにマップをユーザーの場所に向けようとしていて、CoreLocationが実際のユーザーの場所を示すのを待っていません。 CLLocationManagerDelegateメソッドlocationManager(_:didUpdateLocations:)を使用して、ユーザーの実際の場所を取得したときに通知する必要があります。ユーザーの場所を示すようにマップを設定できます。

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、私はあなたが私のコードをたくさんトリムしているのを見ましたが、残りのコード行は必要ではありませんか? – user3766930

+0

btw、地図上に赤いピンをユーザーの正確な場所に表示する方法はありますか?今のところ私は正確な領域しか見ることができません。 – user3766930

+1

'kCLLocationAccuracyBest'の設定は、ドキュメンテーションに従ったデフォルト値なので厳密には必要ではありませんが、設定には害はありません。私は 'CoreLocation'の' authorizationStatus'のチェックを更新しました。 – paulvs

関連する問題