а что если не в viewDidAppear а где-нибудь в viewDidLayoutSubviews() с флагом if needSetupCameraPosition { mapView.camera = camera, needSetupCameraPosition = false }?
да ему просто нужно выставлять выставлять позицию камеры после лэйаута и все. это нормально, что у него съезжает камера когда он ее ставит криво. это как оффсет таблице задавать а потом удивлятся что после назначения ячеек у него что-то едет