2016-10-15 3 views
1

Я пытался решить это в течение нескольких часов, и я не могу найти решение. Я пытаюсь создать кнопку на моем представлении карты, которая приближается к местоположению пользователей при нажатии. Вот код для функции, которая относится к кнопке:Увеличьте местоположение пользователя в iOS

func zoomInOnLocation() { 
    let userLocation = MKUserLocation() 
    let locationManager = CLLocationManager() 
    locationManager.requestWhenInUseAuthorization() 

    let currentLocation: CLLocation? = userLocation.location 
    let latitude = currentLocation?.coordinate.latitude 
    let longitude = currentLocation?.coordinate.longitude 
    let span: MKCoordinateSpan = MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05) 
    let location: CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude!, longitude!) 
    let region: MKCoordinateRegion = MKCoordinateRegionMake(location, span) 
    mapView.setRegion(region, animated: true) 
} 

При нажатии на кнопке в тренажере, я получаю сообщение об ошибке с указанием фатальной ошибкой:

unexpectedly found nil while unwrapping an Optional value

с пятой линией mapDelegate.mapView!... выделенной в красном. Кроме того, я добавил правильный тег: Info.plist. Буду признателен за любую оказанную помощь.

+3

Удалить пятую строчку. Вы не должны вызывать этот метод. Это метод делегата. Вид карты вызывает это, а не вы. – matt

+0

Я пробовал, чтобы полученная та же ошибка на строке объявляла константу «location». –

+0

Вы проверили устройство iOS? – Maddy

ответ

0

Таким образом, вы, вероятно, не хотите взаимодействовать с делегатом mapView, как вы это делаете прямо сейчас.

Как о добавлении делегатов в классе зрения, которая держит MAPview, как это:

class ViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate { 

и установка делегатов в viewDidLoad():

override func viewDidLoad() { 
    super.viewDidLoad() 

    locationManager.delegate = self 
    mapView.delegate = self 

    } 

И, конечно, хотят иметь locationManager и userLocation настройки:

let locationManager = CLLocationManager() 
    var userLocation = CLLocation() 

Обратите внимание, что userLocation является переменной, поскольку, скорее всего, вы захотите ее обновить в какой-то момент.

Это, как вы, вероятно, хотите работать с locationManager:

locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.startUpdatingLocation() 

Вы бы внести изменения в соответствии с потребностями вашего приложения, а также принимая во внимание, что требуемая точность оказывает влияние на срок службы батареи. Кроме того, вы запускаете и останавливаете обновления в userLocation? Потому что я не вижу этого в вашем коде, если вы не делаете его вне этой функции.

Хорошей практикой является попытка свести к минимуму то, что конкретная функция выполняет до одной задачи. Вероятно, вы захотите выполнить всю эту настройку в другом месте, а затем просто увеличить масштаб внутри функции. :)

Наконец, чтобы увеличить масштаб, вы можете изменить значения MKCoordinateSpanMake и помнить, что большие значения масштаба увеличивают масштаб карты, поэтому можно видеть меньшую область.

let userLocationCoordinates = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude, longitude: userLocation.coordinate.longitude) 
    let span = MKCoordinateSpanMake(0.3, 0.3) 
    let region = MKCoordinateRegion(center: userLocationCoordinates, span: span) 
    mapView.setRegion(region, animated: true) 

Надеюсь, это поможет вам немного, дайте мне знать, как это происходит!

0

Проверьте это:

if #available(iOS 9.0, *) { 
    locationManager.requestLocation() 
    } else { 
    // Fallback 
    } 

let latitude:CLLocationDegrees = //insert latitutde 

let longitude:CLLocationDegrees = //insert longitude 

let latDelta:CLLocationDegrees = 0.05 

let lonDelta:CLLocationDegrees = 0.05 

let span = MKCoordinateSpanMake(latDelta, lonDelta) 

let location = CLLocationCoordinate2DMake(latitude, longitude) 

let region = MKCoordinateRegionMake(location, span) 

mapView.setRegion(region, animated: false) 

Для более: Making the map zoom to user location and annotation (swift 2)

0

Возможно, это поможет. Я создал эту функцию для масштабирования в область, определенную массивом позиций, начиная от текущего местоположения пользователя и заканчивая областью вокруг множества точек, составляющих полилинию. Функция обеспечивает буфер вокруг точек на основе константы regionPaddingFactor, установленной в моих системных константах.

func setRectView(_ locations: [MKAnnotation], mapView: MKMapView) // Size the area for display and reset the view 
{ 
    var maxLat = -90.0 
    var minLat = 90.0 
    var maxLon = -180.0 
    var minLon = 180.0 

    if locations.count >= 1 { 
     for waypoint in locations { 
      maxLat = max(maxLat, waypoint.coordinate.latitude) 
      minLat = min(minLat, waypoint.coordinate.latitude) 
      maxLon = max(maxLon, waypoint.coordinate.longitude) 
      minLon = min(minLon, waypoint.coordinate.longitude) 
     } 
     let loc = CLLocationCoordinate2DMake((maxLat-fabs(maxLat - minLat)/2), (maxLon-fabs(maxLon - minLon)/2)) 
     let span = MKCoordinateSpanMake(0.001 + (1.0 + Setting.shared.regionPaddingFactor) * fabs(maxLat - minLat), 0.001 + (1.0 + Setting.shared.regionPaddingFactor) * fabs(maxLon-minLon)) 

     // The 0.001 values above ensure that you do not get a 0.0 valued span if all of the points have the same latitude, longitude, or both, or if there is only one point 
     // The regionPaddingFactor is a constant to allow some space around the points passed in 

     let reg = MKCoordinateRegionMake(loc, span) 

     mapView.setRegion(reg, animated: true) 
     mapView.animatedZoom(zoomRegion: reg, duration: 0.8) 
    } 
} 

В коде вызова, я обеспечиваю 3 настройки, которые вращаются, как пользователь нажимает на кнопку:

  1. Показать плотный вид (просто передать текущее местоположение в вызове)
  2. Покажите весь маршрут (пройти все точки в шаблоне)
  3. Изменить ручное масштабирование/позиционирование

Последние Optio n необходимо, так как я вызываю функцию всякий раз, когда принимается новая текущая позиция, чтобы переместить представление в зависимости от текущего местоположения, которое повторно переориентирует представление, если пользователь пытается переместить карту.

Если вы не хотите гибкости при отправке различных массивов позиций, вы можете сделать это позиционирование здесь, используя mapView.nnation или просто текущее местоположение в качестве массива.

Смежные вопросы