模态视图防止其他视图旋转
Posted
技术标签:
【中文标题】模态视图防止其他视图旋转【英文标题】:Modal View prevents other views from rotating 【发布时间】:2012-04-13 13:31:08 【问题描述】:我的 MainViewController 中有这个方法:
-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
NSLog(@"MAIN CONTAINER WILL ANIMATE");
[super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
当我旋转时,NSLog 出现了,一切都很完美。但是,如果我从 MainViewController 中显示 modalViewController,然后旋转,则 NSLog 不再出现,并且我的 MainViewController 永远不知道设备已旋转,因此当 modalView 被关闭时,界面不会针对旋转进行调整。
关于为什么模态视图可以阻止父级接收旋转更新的任何想法?这是典型的,还是我的设置有问题?
为了确保,我尝试通过[mainViewController.view addSubview:modalView.view]
将 modalViewController 呈现为子视图,并且旋转更新正确生效。只有当我执行[mainViewController presentModalViewController:modalViewController];
时,更新才会生效。
【问题讨论】:
我不知道为什么模态视图控制器会阻止这个方法调用,我自己也对这个问题感到沮丧!所以恐怕我不太了解为什么不这样做,但我确实知道如何绕过它。我假设在您的代码中的某处,您使用 [self.view presentModalViewController:viewController] 行?而不是这样做,只需做 [self.view addSubview:viewController.view] (我认为它的这个,没有我面前的代码)基本上而不是模态地呈现它只是将它的视图添加到当前视图和所有现在应该调用 will/did/is 轮换方法! 而不是什么..查看我的更新..也许这就是你得到的。但我不希望它成为子视图..我想让它作为模式视图.. 对不起...触发快乐输入键! :D 现已编辑! 问题是只有在你的主视图可见时才会调用它。添加模态视图后,您的主视图将不再捕捉旋转的调用。如果你愿意,你可以像我在这篇文章中的回复一样做一些事情:***.com/questions/10131869/… 如果你使用该方法,主视图控制器仍然会收到发生旋转的通知,即使它不可见。不确定这是否会 100% 帮助你,但我想这是一个开始。 【参考方案1】:当然,当视图控制器以模态方式呈现时,其他视图控制器根本不会收到任何消息。这就是模态在这种情况下的含义。
显而易见的解决方案是在无模式视图控制器的 viewWillAppear 方法中检查方向。
【讨论】:
然后在 viewWillAppear 中,我必须自定义设置所有内容的大小,因为视图仍然认为它的宽度是 320,并且不会发生 autoResizing。如何在不手动设置框架大小的情况下自动将所有内容调整为新的视图宽度? 您可以尝试设置主视图的 autoresizesSubviews 属性。这可能会有所帮助。 在 ios 6 或更高版本中,在 viewDidLayoutSubviews 中执行此操作。在 viewWillAppear 中,视图的维度尚未更新。【参考方案2】:您必须检查以下内容的实现:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
// Overriden to allow any orientation.
return YES;
在两个视图中。
【讨论】:
你返回的模态视图是什么?【参考方案3】:您需要在 viewWillAppear 中将布局调整为当前界面方向。显然,由于视图是不可见的,所以在模态视图控制器启动时不会调用动画函数。
【讨论】:
以上是关于模态视图防止其他视图旋转的主要内容,如果未能解决你的问题,请参考以下文章