In my map app, I want to save the camera position just before the app terminates. When the app starts again, I want the camera to move to the saved position. This way, the user can continue using the map from where he/she left off last time.
So in the VC that contains the map view, I added this:
deinit {
    let mapView = self.view as! GMSMapView
    UserDefaults.standard.set(mapView.camera.target.longitude, forKey: "lastLongitude")
    UserDefaults.standard.set(mapView.camera.target.latitude, forKey: "lastLatitude")
    UserDefaults.standard.set(mapView.camera.zoom, forKey: "lastZoom")
    UserDefaults.standard.set(mapView.camera.bearing, forKey: "lastBearing")
    UserDefaults.standard.set(mapView.camera.viewingAngle, forKey: "lastViewingAngle")
}
override func viewDidLoad() {
    let camera = GMSCameraPosition.camera(withLatitude: 0, longitude: 0, zoom: 3)
    let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
    mapView.isMyLocationEnabled = true
    view = mapView
    mapView.delegate = self
    // ...
    let longitude = UserDefaults.standard.double(forKey: "lastLongitude")
    let latitude = UserDefaults.standard.double(forKey: "lastLatitude")
    let zoom = UserDefaults.standard.float(forKey: "lastZoom")
    let bearing = UserDefaults.standard.double(forKey: "lastBearing")
    let viewingAngle = UserDefaults.standard.double(forKey: "lastViewingAngle")
    mapView.animate(to: GMSCameraPosition(target: CLLocationCoordinate2D(latitude: latitude, longitude: longitude), zoom: zoom, bearing: bearing, viewingAngle: viewingAngle))
}
The logic here is that when the VC is deinitialized, I save the map view's camera position to UserDefaults. Then in viewDidLoad, I move the camera to the saved position.
When I run the app, I moved the camera to an arbitrary position, pressed the stop button in Xcode, and opened up the app again. The camera is back at the initial position (0, 0) again, instead of the arbitrary position I moved it to.
After debugging, I found that deinit isn't even called! I am really confused.
Is this right way to save the camera position? What have I done wrongly?
Declare class as Final
final class viewController: UIViewController, GMSMapViewDelegate
ViewController.swift
var mapView:GMSMapView!
ViewController.swift
static let sharedInstance: MapController = MapController()
ViewController.swift in ViewDidLoad()
let camera = GMSCameraPosition.camera(withLatitude: 0, longitude: 0, zoom: 3)
    MapController.sharedInstance.mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
 //    ...
    let tempUser: UserDefaults = UserDefaults.standard
    let longitude = tempUser.double(forKey: "lastLongitude")
    let latitude = tempUser.double(forKey: "lastLatitude")
    let zoom = tempUser.float(forKey: "lastZoom")
    let bearing = tempUser.double(forKey: "lastBearing")
    let viewingAngle = tempUser.double(forKey: "lastViewingAngle")
    MapController.sharedInstance.mapView.animate(to: GMSCameraPosition(target: CLLocationCoordinate2D(latitude: latitude, longitude: longitude), zoom: zoom, bearing: bearing, viewingAngle: viewingAngle))
When save data in Userdefault then always synchronize() data after all value are set successfully.
ViewController.swift
func mapView(mapView: GMSMapView, idleAtCameraPosition position: GMSCameraPosition) {
        let tempUser: UserDefaults = UserDefaults.standard
        tempUser.set(mapView.camera.target.longitude, forKey: "lastLongitude")
        tempUser.set(mapView.camera.target.latitude, forKey: "lastLatitude")
        tempUser.set(mapView.camera.zoom, forKey: "lastZoom")
        tempUser.set(mapView.camera.bearing, forKey: "lastBearing")
        tempUser.set(mapView.camera.viewingAngle, forKey: "lastViewingAngle")
        tempUser.synchronize()
}
Appdelegate.swift
func applicationWillTerminate(_ application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
        var saveLocation = MapController.sharedInstance
        let mapView = saveLocation.mapView as GMSMapView
        let tempUser: UserDefaults = UserDefaults.standard
        tempUser.set(mapView.camera.target.longitude, forKey: "lastLongitude")
        tempUser.set(mapView.camera.target.latitude, forKey: "lastLatitude")
        tempUser.set(mapView.camera.zoom, forKey: "lastZoom")
        tempUser.set(mapView.camera.bearing, forKey: "lastBearing")
        tempUser.set(mapView.camera.viewingAngle, forKey: "lastViewingAngle")
        tempUser.synchronize()
    }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With