0

我有一个 UIViewcontroller 托管了很多 Viewcontrollers。我在它及其子视图上设置了自动旋转,一旦应用程序加载它就可以正常工作。我遇到的问题是,在初始加载过程中,应用程序必须在本地连接并下载一些文件。在此加载过程中,如果用户旋转 iPad,UIViewController 将无法正确旋转!我确实设置了标志并应该自动旋转,但仍然无法正常工作。

PS:我允许这四个方向:

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
 {
  return (interfaceOrientation == UIInterfaceOrientationPortrait ||
        interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
        interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown ||
        interfaceOrientation == UIInterfaceOrientationLandscapeRight);
 }

加载完成后,行为正确并正确旋转。现在我认为这可能是因为其中一些内部 VC 正在加载一些数据,让我解释一下:大视图控制器托管所有其他 VC(我们称他为 BigDaddy),在 bigdaddy 的 Viewdidload 中我有(为了论证)另外三个视图控制器:Busta、Skeezix 和劳伦斯。所以我这样做:

[[Busta alloc] initWithNibName:@"Busta" bundle:nil];

这反过来又调用了-viewDidLoadBusta,所以我通过执行以下操作使该异步的文件加载部分:

    dispatch_async(dispatch_get_main_queue(), ^{
    }); 

这些更改确实有点帮助,因为在异步调度之前加载过程需要 5 秒(在这几秒内,iPad 中的任何倾斜都会导致旋转事件并且我的整个视图都消失了。现在我得到了那些 5秒减少到 1.2 秒。我的问题是,我的问题有解决方案吗?它永远不会工作吗?是否可以让应用程序在四个方向上旋转并在加载数据时响应旋转变化?

4

2 回答 2

1

我怀疑问题在于您如何进行“连接”。我假设您的意思是您正在使用 NSURLConnection 或类似方法连接到远程服务器。请注意,如果您在主线程上使用同步连接,您冻结应用程序,直到连接完成。适当的方法是利用异步调用,或者更好地将工作转移到辅助线程(参见 NSOperationQueue 文档),然后将基于该信息的 UI 更新移回主线程(再次参见 NSOperationQueue 文档)。

WWDC 2012 视频中有一个很好的例子。

于 2013-02-24T04:23:25.543 回答
0

为什么不直接实现您的-shouldAutorotateToInterfaceOrientation...方法,使其仅在应用程序完成加载所需数据后才允许旋转?

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    BOOL appIsFinishedLoadingData = <your code here>
    return shouldRotate;
}

(考虑到您允许所有可能的轮换,我缩短了您的代码,因此实际上无需检查提供的轮换。您的方式更具前瞻性,我的方式更易于阅读。)

于 2013-02-24T04:23:52.887 回答