Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Issues with map view camera heading

I am having issues with the order/way that I'm setting up my UIMapView. This is what I would like to happen:

View appears - Map rotates to specified heading

Reset button tapped - If user has moved the map, it will reset to the default heading and zoom

At the moment the map is rotated to the heading when the map appears, but the reset button does nothing. I suspect this is down to the order I am doing things because if I flip two lines of code around, it works, but it doesn't rotate to the correct heading when the map appears.

Here is my code:

@IBAction func rotateToDefault(sender: AnyObject) {
    mapView.setRegion(zoomRegion, animated: true)
    mapView.camera.heading = parkPassed.orientation!
}

override func viewWillAppear(animated: Bool) {
    setUpMapView()
}

override func viewDidAppear(animated: Bool) {
    mapView.setRegion(zoomRegion, animated: true)
    mapView.camera.heading = parkPassed.orientation!
}

func setUpMapView() {
    rideArray = ((DataManager.sharedInstance.rideArray) as NSArray) as! [Ride]

    zoomRegion = MKCoordinateRegionMakeWithDistance(CLLocationCoordinate2D(latitude: parkPassed.latitude!, longitude: parkPassed.longitude!), 1000, 1000)
    mapView.setRegion(zoomRegion, animated: true)
    mapView.delegate = self

    for ride in rideArray {
        var subtitle = ""
        if locationManager.location == nil {
            subtitle = "Distance unavailable"
        } else {
            let userLocation = CLLocation(latitude: locationManager.location.coordinate.latitude, longitude: locationManager.location.coordinate.longitude)
            let annotationLocation = CLLocation(latitude: ride.latitude!, longitude: ride.longitude!)

            var distance = Int(CLLocationDistance(annotationLocation.distanceFromLocation(userLocation)))

            if distance > 1000 {
                distance = distance / 1000
                subtitle = "\(distance) kilometers"
            } else {
                subtitle = "\(distance) meters"
            }
        }

        let annotation = RideAnnotation(coordinate: CLLocationCoordinate2DMake(ride.latitude!, ride.longitude!), title: ride.name!, subtitle: subtitle)
        self.qTree.insertObject(annotation)
        annotationsAdded.insertObject(annotation, atIndex: 0)

        println(qTree.count)
    }
}

Anyone have any suggestions?

like image 695
user3746428 Avatar asked Aug 07 '15 21:08

user3746428


1 Answers

I had a similar problem.

It appears region and camera are two mutual exclusive concepts to determine how you see which part of the map.

If you use region, you have coordinate and span to determine what you see (you already did this in your code)

If you use camera, you have coordinate, distance, pitch and heading to determine how you see the map.

use mapView.setCamera(...) to smoothly change what you see, including the heading.

To define your camera view you do something like

let camera = MKMapCamera(lookingAtCenterCoordinate: userLocation, fromDistance: 1000, pitch: 0, heading: heading)
self.mapView.setCamera(camera, animated: false)

From Apples Documentation:

Assigning a new camera to this property updates the map immediately and without animating the change. If you want to animate changes in camera position, use the setCamera:animated: method instead.

like image 99
Gerd Castan Avatar answered Oct 11 '22 16:10

Gerd Castan