Objective c 正确恢复MKMapView可见状态/区域

Objective c 正确恢复MKMapView可见状态/区域,objective-c,cocoa-touch,mkmapview,viewstate,uiinterfaceorientation,Objective C,Cocoa Touch,Mkmapview,Viewstate,Uiinterfaceorientation,我有一个小iPad应用程序,它显示了一个MKMapView实例(map)。为了保存状态,我尝试将map.region保存到NSUserDefaults。这可以很好地将单个值存储为双倍值。启动时,应用程序将这些数字组合在一起,并生成一个有效的MKCoordinateRegion。这发生在应用程序:didfishlaunchingwithoptions:中。现在有几个问题 1)想象一下:您将应用程序置于横向。应用程序保存相应的MKCoordinateRegion。应用程序已终止。现在,拿着iPad,

我有一个小iPad应用程序,它显示了一个MKMapView实例(
map
)。为了保存状态,我尝试将
map.region
保存到NSUserDefaults。这可以很好地将单个值存储为双倍值。启动时,应用程序将这些数字组合在一起,并生成一个有效的
MKCoordinateRegion
。这发生在
应用程序:didfishlaunchingwithoptions:
中。现在有几个问题

1)想象一下:您将应用程序置于横向。应用程序保存相应的
MKCoordinateRegion
。应用程序已终止。现在,拿着iPad,启动应用程序,地图上显示的状态与离开应用程序之前的状态不同。不,这不是
地区的问题。
。我找到了它,结果是:当用户看不到它时,应用程序以纵向模式启动。应用程序恢复了他的状态。之后,地图将旋转为横向模式

换言之,应用程序保存横向状态,但将其恢复为纵向。如果重复这些步骤,地图会随着每次启动而缩小。不是最好的用户体验

2)即使问题一可以通过恢复正确方向来解决,仍然存在发射方向可能与离开方向不同的问题。我认为解决这个问题的一个更好的方法是,当用户离开风景区时,始终存储纵向方向的值。通过这样做,状态将被正确恢复,因为应用程序最初是由系统纵向启动的

一种可能的方法是,如果应用程序留在横向中,则更改纬度/经度值。但这太不准确了,因为
CLLocationDegrees
在纬度或经度上是不同的

另一种方法(我认为这是最好的方法)是“模拟”地图视图的旋转,或者在应用程序离开时计算纵向模式的可见区域。但我真的不知道怎么做。我需要你的帮助和你的想法


我感激每一丝希望如果我想的方向不对,请告诉我。

嗯。如果我正确理解了您的问题,您正在保存MKMapView的
区域(即其
中心
span
),并希望使用这些值恢复地图的中心和缩放级别,独立于用户是否在会话之间旋转设备


您是否尝试过计算地图矩形的宽高比,然后乘以对跨度的更改?也就是说,如果您的地图在横向模式下有大小为800 x 600的边界,那么您可以将纵向边界乘以600/800(0.75),将横向边界乘以800/600(1.33),以获得在纵向模式下600 x 800矩形的适当跨度。

使用
map.visibleRect
MKMapRect
进行了尝试,通过切换宽度和高度并移动原点来计算旋转。我认为它比CLLocationDegrees更准确,但它也有一些副作用。我认为唯一的方法是强制地图计算值,而不是自己计算。地图视图是在根视图控制器上还是在其他控制器上?
setRegion
究竟在哪里调用?在应用程序中:didFinishLaunchingWithOptions:,viewDidLoad,ViewDidDisplay,other?[AppDelegate应用程序:DidFinishLaunchWithOptions:->inits UINavigationController->rootViewController是一个自定义的ViewController,它拥有地图视图->地图还原功能。区域
发生在
加载视图
中,我很喜欢你的想法,但如果你离开并重新启动应用程序,它每次都会缩小。我认为,这又是一个
regionatfits:
(通过设置
map.region
自动调用)的问题,因为将比率应用于坐标会计算该区域的“中断”缩放级别。非常感谢您的想法!如果将计算出的纬度德尔塔和纵向德尔塔减半度,则贴图将适合右缩放级别。:)