2016-02-28 7 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 के लिए दो प्रविष्टियां कहा::

NSLocationAlwaysUsageDescription 
NSLocationWhenInUseUsageDescription 

और यह भी मेरी xcode में मैं, लंदन पर जीपीएस डेटा का अनुकरण करने के लिए ब्रिटेन की स्थापना की है यह मेरा कोड अब तक है।

जब मैं ऐप चलाता हूं - मुझे नक्शा दिखाई देता है, लेकिन लंदन को चिह्नित नहीं किया जाता है। मैं क्या गलत कर रहा हूं?

Btw, मैं इस लाइन बाहर टिप्पणी करने के लिए किया था:

//mapView.delegate = self 
viewDidLoad() में

, अन्यथा मैं त्रुटि थी:

Cannot assign value of type YourCurrentLocation to type MKMapViewDelegate 

और मुझे यकीन है कि अगर समस्या का एक हिस्सा है नहीं कर रहा हूँ यहाँ।

जब मैं उपयोगकर्ता मानचित्र और उसके मानचित्र के साथ उस मानचित्र पर चिह्नित बिंदु पर प्रदर्शित होता हूं तो मैं प्रभाव प्राप्त करना चाहता हूं। क्या उसके लिए आपके द्वारा मेरी मदद की जाएगी?

+0

'locationManager.location! 'आपके कोड में आपको सिम्युलेटर या डिवाइस का अंतिम स्थान मिलेगा, जो कुछ भी हो सकता है। मेरे उत्तर में मैं आपको वास्तविक उपयोगकर्ता स्थान प्राप्त करने के लिए 'CLLocationManagerDelegate' का उपयोग करने का तरीका दिखाता हूं। – paulvs

+0

ठीक है, मैं देखता हूं ... धन्यवाद! एक आखिरी सवाल - एक स्थिति में क्या होगा जब फोन जीपीएस रेंज में नहीं है या स्थान अभी तक असली के रूप में प्रतिष्ठित नहीं है? – 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

ठीक है, मुझे लगता है कि आपने मेरे कोड को बहुत छंटनी की है, क्या बाकी कोड लाइन आवश्यक नहीं हैं? – user3766930

+0

बीटीडब्ल्यू, क्या उपयोगकर्ता के सटीक स्थान पर मानचित्र पर लाल पिन दिखाने का कोई तरीका है? अब तक मैं केवल सटीक क्षेत्र देख सकता हूं .. – user3766930

+1

'kCLLocationAccuracyBest' सेट करना कड़ाई से जरूरी नहीं है क्योंकि यह दस्तावेज़ के अनुसार डिफ़ॉल्ट मान है, हालांकि इसे स्थापित करने में कोई हानि नहीं है। मैंने 'कोरलोकेशन' के 'प्राधिकरण स्टेटस' की जांच भी अपडेट की। – paulvs

संबंधित मुद्दे

 संबंधित मुद्दे