web-dev-qa-db-ja.com

SwiftのMKMapViewで現在の場所と更新場所を表示

新しいSwift言語の使用方法を学習しています(Swiftのみ、Objective-Cはありません)。それを行うには、マップ(MKMapView)を使用して簡単なビューを作成します。ユーザーの場所を見つけて更新したい(Apple Mapアプリのように)。

私はこれを試しましたが、何も起こりませんでした:

import MapKit
import CoreLocation

class MapView : UIViewController, CLLocationManagerDelegate {

    @IBOutlet weak var map: MKMapView!
    var locationManager: CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()

        if (CLLocationManager.locationServicesEnabled())
        {
            locationManager = CLLocationManager()
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            locationManager.requestAlwaysAuthorization()
            locationManager.startUpdatingLocation()
        }
    }
}

手伝っていただけませんか?

42
PMIW

ロケーションマネージャーが現在のロケーションを取得したときに通知を受け取るには、CLLocationManager.didUpdateLocations(CLLocationManagerDelegateの一部)をオーバーライドする必要があります。

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    if let location = locations.last{
        let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
        self.map.setRegion(region, animated: true)
    }
}

注:ターゲットがiOS 8以上の場合、位置サービスを機能させるには、Info.plistにNSLocationAlwaysUsageDescriptionまたはNSLocationWhenInUseUsageDescriptionキーを含める必要があります。

61
zisoft

100%の作業、簡単な手順、テスト済み

ライブラリのインポート:

import MapKit
import CoreLocation

デリゲートを設定します。

CLLocationManagerDelegate,MKMapViewDelegate

変数を取る:

let locationManager = CLLocationManager()

viewDidLoad()で次のコードを記述します。

self.locationManager.requestAlwaysAuthorization()

    // For use in foreground
    self.locationManager.requestWhenInUseAuthorization()

    if CLLocationManager.locationServicesEnabled() {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.startUpdatingLocation()
    }

    mapView.delegate = self
    mapView.mapType = .standard
    mapView.isZoomEnabled = true
    mapView.isScrollEnabled = true

    if let coor = mapView.userLocation.location?.coordinate{
        mapView.setCenter(coor, animated: true)
    }

場所のデリゲートメソッドを記述します。

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let locValue:CLLocationCoordinate2D = manager.location!.coordinate

    mapView.mapType = MKMapType.standard

    let span = MKCoordinateSpanMake(0.05, 0.05)
    let region = MKCoordinateRegion(center: locValue, span: span)
    mapView.setRegion(region, animated: true)

    let annotation = MKPointAnnotation()
    annotation.coordinate = locValue
    annotation.title = "Javed Multani"
    annotation.subtitle = "current location"
    mapView.addAnnotation(annotation)

    //centerMap(locValue)
}

info.plistで権限を設定することを忘れないでください

<key>NSLocationWhenInUseUsageDescription</key>
<string>This application requires location services to work</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>This application requires location services to work</string>

次のようになります。

enter image description here

21

Swift 3およびXCode 8の場合、この答えが見つかります。

  • 最初に、プライバシーをinfo.plistに設定する必要があります。文字列NSLocationWhenInUseUsageDescriptionを挿入し、ユーザーの場所を取得する理由を説明とともに入力します。たとえば、「アプリケーションのマップ用」という文字列を設定します。

  • 次に、このコード例を使用します

    @IBOutlet weak var mapView: MKMapView!
    
    private var locationManager: CLLocationManager!
    private var currentLocation: CLLocation?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        mapView.delegate = self
    
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
    
        // Check for Location Services
    
        if CLLocationManager.locationServicesEnabled() {
            locationManager.requestWhenInUseAuthorization()
            locationManager.startUpdatingLocation()
        }
    }
    
    // MARK - CLLocationManagerDelegate
    
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        defer { currentLocation = locations.last }
    
        if currentLocation == nil {
            // Zoom to user location
            if let userLocation = locations.last {
                let viewRegion = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 2000, 2000)
                mapView.setRegion(viewRegion, animated: false)
            }
        }
    }
    
  • 3番目に、mapViewのストーリーボードでユーザーの場所フラグを設定します。

20
Evgeny Karev

MyLocation はSwift iOSデモです。

このデモは次の目的に使用できます。

  1. 現在の場所を表示します。

  2. 他の場所を選択します。この場合、場所の追跡を停止します。

  3. タッチしたときにプッシュピンをMKMapView(iOS)に追加します。

7
Ahmed Lotfy

Swift 2の場合、次のように変更する必要があります。

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let location = locations.last

    let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)
    let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))

    self.map.setRegion(region, animated: true)
}
3
Mark

CLLocationManager.didUpdateLocationsをオーバーライドする必要があります

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

    let userLocation:CLLocation = locations[0] as CLLocation
    locationManager.stopUpdatingLocation()

    let location = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude, longitude: userLocation.coordinate.longitude)

    let span = MKCoordinateSpanMake(0.5, 0.5)

    let region = MKCoordinateRegion (center:  location,span: span)

    mapView.setRegion(region, animated: true)
}

また、NSLocationWhenInUseUsageDescriptionNSLocationAlwaysUsageDescriptionをplist設定に追加する必要がありますResultを値として

1
MiladiuM

Swift 4では、上で定義したlocationManagerデリゲート関数を使用していました。

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

..しかし、これを..に変更する必要がありました.

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

これは.. https://github.com/lotfyahmed/MyLocation/blob/master/MyLocation/ViewController.Swift から来ました-ありがとう!

1
Tybion

こんにちはコードでshowsUserLocationを設定しても、何らかの奇妙な理由で機能しない場合があります。

したがって、次の組み合わせを試してください。

ViewDidLoad()で

  self.mapView.showsUserLocation = true

Xcodeでストーリーボードに移動し、右側のパネルの属性インスペクターでユーザーの場所チェックボックスにチェックマークを付け、のように添付画像。アプリを実行すると、ユーザーの場所が表示されるはずです。

enter image description here

0
Vision Mkhabela