iPad Modal View 旋转 parentViewController 视图

Posted

技术标签:

【中文标题】iPad Modal View 旋转 parentViewController 视图【英文标题】:iPad Modal View rotates parentViewController View 【发布时间】:2010-09-20 02:13:30 【问题描述】:

当应用程序处于横向模式(我打算强制)时,显示模式视图会导致父视图旋转到纵向模式。如果我将 shouldAutoRotateToInterfaceOrientation 的返回值设置为 NO,则父级不会旋转,但是模态会从侧面滑入并侧向显示。下面是显示模态的代码。

- (IBAction)loadExistingGame:(id)sender 

SavedGamesTableViewController *savedGames = [[SavedGamesTableViewController alloc] initWithStyle:UITableViewStyleGrouped];
savedGames.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:savedGames animated:YES];

[savedGames release];

根据要求,这里是 SavedGamesTableViewController 的 shouldAutoRotate 方法的内容

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
// Override to allow orientations other than the default portrait orientation.
return YES;

【问题讨论】:

请在 SavedGamesTableViewController 中显示shouldAutoRotateToInterfaceOrientation 的实现。 添加了方法,但它只是样板生成的代码。 【参考方案1】:

好的,我知道需要做些什么来修复它。包含可能方向列表的 plist 文件需要限制为单个横向视图。只有当方向与 plist 文件中的唯一方向匹配时,模态表视图的父级才需要让 shouldAutoRotateToInterfaceOrientation 方法返回 YES。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
// Overriden to allow any orientation.
return interfaceOrientation = UIInterfaceOrientationLandscapeRight;

模态视图控制器应该为相同的方法返回 NO。

【讨论】:

【参考方案2】:

基于

当应用程序处于横向时 模式(我打算强制), 显示模态视图会导致 父视图旋转到纵向 模式。

根据要求,这里是 的 shouldAutoRotate 方法 SavedGamesTableViewController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
// Override to allow orientations other than the default portrait orientation.
return YES;

所以您的意思是父视图控制器尚未设置为仅强制使用横向,当您显示设置为允许所有方向的模态视图时,您想知道为什么您的父视图会旋转将设备旋转为纵向时要纵向?我不明白你的问题......你不是说父视图控制器当前设置为允许旋转到纵向吗?这种行为不正是应该发生的吗?

【讨论】:

否,设备没有被旋转。当显示模态视图时,模态视图的父级会旋转。 除了SavedGamesTableViewController,屏幕上是否显示了另一个控制器?文档指出,所有屏幕控制器都必须同意自动旋转才能发生;如果在该模式对话框中只有一个屏幕上的视图控制器设置为仅使用纵向,那么它将仅以纵向显示。 屏幕上唯一的其他控制器是模态框中包含的tableviewcontroller。对于 shouldautorotate... 方法,它具有相同的样板代码。【参考方案3】:

我在调出模态邮件视图时遇到了类似的问题。强制旋转对我不起作用,但在应用程序的主视图控制器而不是子视图控制器上调用 presentModalViewController 解决了这个问题。

【讨论】:

没有成功。我什至在使用window.rootViewController,但仍然没有变化。【参考方案4】:

我看到了同样的行为;在我的情况下,问题是我已经实现了 shouldAutorotateToInterfaceOrientation 以无条件地为父视图控制器返回 YES,但不是为呈现的模态视图控制器。所以我怀疑 Shaggy Frog 的评论是关键:无论您是否要强制横向模式,您都需要确保两个视图控制器的 shouldAutorotateToInterfaceOrientation 实现一致,否则会出现奇怪的情况。

【讨论】:

【参考方案5】:
UIViewController *vc = /* create view controller */;
UINavigationController *nc = nil;
if (ios_VERSION_LESS_THAN_6_0) 
    nc = [[MyCustomNavigationControllerSupportingAllOrientations alloc] initWithRootViewController:vc];
 else 
    nc = [[UINavigationController alloc] initWithRootViewController:vc];

[self.navigationController presentModalViewController:nc animated:YES];

在 iOS6 上,我使用 UINavigationController。

在 iOS6 之前,我将 UINavigationController 子类化,如下所示:

@interface MyCustomNavigationControllerSupportingAllOrientations : UINavigationController
@end

@implementation MyCustomNavigationControllerSupportingAllOrientations
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    return YES;

@end

【讨论】:

以上是关于iPad Modal View 旋转 parentViewController 视图的主要内容,如果未能解决你的问题,请参考以下文章

重点 : Modal

Translucent Modal ViewController - 如何处理旋转

onClick 不会从 Child 组件更新 Parent 的状态

在 Modal 之后推送 UIView

iOS开发中控制器切换方式Modal

从 Popover View 内部呈现 Modal View Controller