MapKit не находится в правильном месте

У меня проблема с моим MapKit в Swift. Я хочу, чтобы он центрировался на определенной координате, но центр по умолчанию не меняется вообще. Первая (и самая важная часть) моего файла viewController.swift выглядит так:

import UIKit
import Parse
import MapKit
import CoreLocation

class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {

    var map : MKMapView! = MKMapView()
    var locManager:CLLocationManager!

    @IBOutlet var txtUsername: UITextField!
    @IBOutlet var txtPassword: UITextField!

    override func viewDidLoad() {
        var centerCoordinate = CLLocationCoordinate2DMake(41.8796677, -87.6198131)

        var mapSpan = MKCoordinateSpanMake(0.01, 0.01)

        var mapRegion = MKCoordinateRegionMake(centerCoordinate, mapSpan)

        self.map.setRegion(mapRegion, animated: true)

        locManager = CLLocationManager()
        locManager.delegate = self
        locManager.desiredAccuracy = kCLLocationAccuracyBest
        locManager.requestAlwaysAuthorization()
        map.showsUserLocation = true
        super.viewDidLoad()
    }

В чем может быть причина того, что центр карты не изменяется переменной centerCoordinate?

2 ответа

Есть функции, которые вызываются автоматически, когда карта используется. Один из них является

func mapViewDidFinishLoadingMap(mapView: MKMapView)

Попробуйте сделать это.

  func mapViewDidFinishLoadingMap(mapView: MKMapView) {
    map.setRegion(mapRegion, animated: true)
}

Если это не работает, наберите func mapView, посмотрите в списке и найдите тот, который, по вашему мнению, мог бы, но я чувствую, что это именно то, что нужно.

В ViewController.swift найдите viewDidLoad и добавьте следующее в конец метода:

// set initial location in Honolulu
let initialLocation = CLLocation(latitude: 21.282778, longitude: -157.829444)

Вы будете использовать это, чтобы установить начальные координаты вида карты в точку в Гонолулу. Когда вы пытаетесь указать карте, что отображать, вы не можете просто указать широту и долготу. Этого достаточно, чтобы центрировать карту, но вам нужно указать прямоугольную область для отображения, чтобы получить правильный уровень масштабирования. Добавьте в класс следующий константный и вспомогательный метод:

let regionRadius: CLLocationDistance = 1000
func centerMapOnLocation(location: CLLocation) {
  let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, 
    regionRadius * 2.0, regionRadius * 2.0)
  mapView.setRegion(coordinateRegion, animated: true)
}

Аргумент местоположения является центральной точкой. Область будет иметь интервалы между севером, югом и востоком и западом в зависимости от расстояния regionRadius - вы устанавливаете это значение в 1000 метров (1 километр), что составляет чуть больше половины мили. Затем вы используете regionRadius * 2.0 здесь, потому что это хорошо работает для вывода общедоступных графических данных в файл JSON. setRegion сообщает mapView для отображения региона. Вид карты автоматически переводит текущий вид в нужную область с аккуратной анимацией масштабирования, без необходимости в дополнительном коде! Вернуться в viewDidLoadдобавьте следующую строку в конец метода:

centerMapOnLocation(initialLocation)

Это вызовет вспомогательный метод для увеличения initialLocation на старте. Создайте и запустите приложение, и теперь оно должно приблизиться к сердцу Waikiki:]

Шрифт: http://www.raywenderlich.com/90971/introduction-mapkit-swift-tutorial

Свифт 5.

в MKMapViewDelegate, Рекомендую использовать regionDidChangeAnimated метод и установка региона mapViewна основе координаты пользователя. Измените диапазон в соответствии с вашим вариантом использования.

extension MapViewController: MKMapViewDelegate {
    func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
        mapView.setRegion(MKCoordinateRegion(center: userLocation.coordinate, span: MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)), animated: true)
    }
}
Другие вопросы по тегам