Swift Mapkit - уходите от местоположения пользователя

Я хочу отображать местоположение пользователя и окружающую область, но я также хочу, чтобы пользователь мог перемещаться по области. Прямо сейчас, если я попытаюсь прокрутить где-нибудь на карте, он автоматически вернет меня в базовый регион с пользователем в центре. Как мне это остановить? Я хочу показать начальный вид с пользователем в центре, но я также хочу иметь возможность прокручивать. Заранее спасибо, ребята, вы так любезны!

импорт UIKit импорт MapKit импорт CoreLocation

class ViewControllerMain: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {

@IBOutlet weak var mapView: MKMapView!

var locationManager:CLLocationManager!

override func viewDidLoad() {
    super.viewDidLoad()
    locationManager = CLLocationManager()
    locationManager.requestWhenInUseAuthorization()
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.delegate = self
    locationManager.startUpdatingLocation()
    mapView.showsUserLocation = true
    mapView.delegate = self

    let longPress = UILongPressGestureRecognizer(target: self, action: "action:")
    longPress.minimumPressDuration = 1.0
    mapView.addGestureRecognizer(longPress)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
    let regionToZoom = MKCoordinateRegionMake(manager.location.coordinate, MKCoordinateSpanMake(0.01, 0.01))
    mapView.setRegion(regionToZoom, animated: true)
}

person Murph    schedule 10.02.2015    source источник


Ответы (3)


Ваш код в didUpdateLocations сбрасывает регион. У вас есть два варианта.

  1. Сохраните в иваре независимо от того, установили вы уже первое местоположение или нет. Только если вы этого не сделали, вы установите регион.

  2. Установите таймер на 15 секунд. Если карта перемещается пользователем, вы сбрасываете таймер. Когда таймер истечет, вы можете повторно центрировать местоположение пользователя.

Это позволит центрировать карту вокруг пользователя, но позволит им немного перемещаться, чтобы получить некоторый контекст.

В этом ответе показано, как это сделать в Objective-C

person Onato    schedule 11.02.2015
comment
Можете ли вы привести пример любого варианта? Я понимаю концепцию. Синтаксически я что-то делаю неправильно - person Murph; 17.02.2015

locationManager.stopUpdatingLocation();

это все, что вам нужно в конце работы с locationManager, если вы все еще ищете

person Beichen FU    schedule 18.11.2015

В этой ветке был хороший пример как в Swift, так и в Obj C. Обязательно поищите комментарий к ответу, который я связана с, если вы используете Swift.

После настройки используйте поток управления в didUpdateLocations, чтобы он повторно центрировал местоположение пользователя только в том случае, если пользователь не касался карты.

Вот мой полный код в качестве примера:

@IBOutlet weak var theMap: MKMapView!

// ... 


// This var and the three following functions are used to tell if the map moves because of the user. 
// This is used in the control flow in didUpdateLocations

private var mapChangedFromUserInteraction = false


private func mapViewRegionDidChangeFromUserInteraction() -> Bool {
    let view: UIView = self.theMap.subviews[0] as UIView
    //  Look through gesture recognizers to determine whether this region change is from user interaction
    if let gestureRecognizers = view.gestureRecognizers {
        for recognizer in gestureRecognizers {
            if( recognizer.state == UIGestureRecognizerState.Began || recognizer.state == UIGestureRecognizerState.Ended ) {
                return true
            }
        }
    }
    return false
}

func mapView(mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
    mapChangedFromUserInteraction = mapViewRegionDidChangeFromUserInteraction()
    if (mapChangedFromUserInteraction) {
        // user changed map region
        println("user changed map region")


    }
}

func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
    if (mapChangedFromUserInteraction) {
        // user changed map region

        println("user changed map region")


    }
}

// This function is called each time the user moves.  
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {




// Use Control Flow: if the user has moved the map, then don't re-center.
// NOTE: this is using 'mapChangedFromUserInteraction' from above. 

    if mapChangedFromUserInteraction == true {

        // do nothing, because the user has moved the map.

    }

    else {

        // update on location to re-center on the user.

        // set X and Y distances for the span (zoom). This is very zoomed in.
        let spanX = 0.0005
        let spanY = 0.0005

        // Create a region using the user's location, and the zoo. 
        var newRegion = MKCoordinateRegion(center: theMap.userLocation.coordinate, span: MKCoordinateSpanMake(spanX, spanY))

        // set the map to the new region
        theMap.setRegion(newRegion, animated: true)

        }

}
person Jim Wilson    schedule 26.11.2015