我有一个托管很多Viewcontrollers的UIViewcontroller。我在它及其子视图上设置了自动旋转,一旦应用程序加载,它就能正常工作。我遇到的问题是,在初始加载过程中,应用程序必须在本地连接和下载一些文件。在此负载期间,如果用户旋转iPad,则UIViewController无法正常旋转!我确实设置了标志,但仍然没有工作。
PS:我允许这四个方向:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait ||
interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown ||
interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}
加载完成后,行为正确并正确旋转。现在我认为这可能是因为其中一些内部VC正在加载一些数据,让我解释一下: 大视图控制器托管所有其他VC(让我们称他为BigDaddy),在bigdaddy的Viewdidload中(为了论证)另外三个ViewControllers:Busta,Skeezix和lawrence。所以我这样做:
[[Busta alloc] initWithNibName:@"Busta" bundle:nil];
然后又调用了Busta的-viewDidLoad
,所以我做了异步的文件加载部分:
dispatch_async(dispatch_get_main_queue(), ^{
});
这些变化确实有所帮助,因为在异步调度之前,加载过程需要5秒钟(在那些秒内,iPad中的任何倾斜都会导致旋转事件,我的整个视图都消失了。现在我将这5秒降低到1.2秒。 我的问题是,我的问题有解决方案吗?它永远不会起作用吗?是否可以让应用程序在四个方向上旋转并在加载数据时响应旋转变化?
答案 0 :(得分:1)
我怀疑问题在于你是如何做'连接'的。我假设您的意思是您使用NSURLConnection或类似连接到远程服务器。请注意,如果在主线程上使用同步连接,则将冻结应用程序,直到连接完成。适当的方法是利用异步调用,或者更好地将工作移动到辅助线程(请参阅NSOperationQueue文档),然后根据该信息将UI的任何更新移回主线程(再次参见NSOperationQueue文档)。
WWDC 2012视频中有一个很好的例子。
答案 1 :(得分:0)
为什么不实施-shouldAutorotateToInterfaceOrientation...
方法,只有在应用程序加载完所需数据后才允许轮换?
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
BOOL appIsFinishedLoadingData = <your code here>
return shouldRotate;
}
(考虑到你允许所有可能的旋转,我缩短了你的代码,所以真的没有必要检查提供哪种旋转。你的方式更具有前瞻性,我的阅读更容易一些。)