新しい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()
}
}
}
手伝っていただけませんか?
ロケーションマネージャーが現在のロケーションを取得したときに通知を受け取るには、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
キーを含める必要があります。
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>
次のようになります。
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のストーリーボードでユーザーの場所フラグを設定します。
MyLocation はSwift iOSデモです。
このデモは次の目的に使用できます。
現在の場所を表示します。
他の場所を選択します。この場合、場所の追跡を停止します。
タッチしたときにプッシュピンをMKMapView(iOS)に追加します。
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)
}
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)
}
また、NSLocationWhenInUseUsageDescription
とNSLocationAlwaysUsageDescription
をplist設定に追加する必要がありますResult
を値として
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 から来ました-ありがとう!