iOS - viewController 包含和自动旋转
Posted
技术标签:
【中文标题】iOS - viewController 包含和自动旋转【英文标题】:iOS - viewController containment and autorotations 【发布时间】:2012-11-04 12:40:59 【问题描述】:我的应用支持两组 viewController,那些应该在纵向工作的和应该在横向工作的。
呈现不同方向的视图控制器会导致方向错误,所以有人建议我创建一个视图控制器包含主视图控制器(使所有方向都应该自动旋转)并从中添加两个视图控制器分支,一个用于纵向(带有shouldAutorotate YES 用于纵向)和一个用于横向(使用 shouldAutorotate YES 用于横向)。我的问题是:这行得通吗?我的意思是,每个分支上的每个 viewController 都会旋转到正确的方向吗?
另一个问题是:我的项目基于单视图 Xcode 模板。该模板创建一个 RootViewController 作为应用程序启动时显示的那个。我的问题是:为了使包含建议有效,我必须在容器 viewController 中转换这个 rootViewController,并且我必须将它拥有的所有代码移动到另一个视图控制器并在应用程序启动时呈现。我的意思是:
我今天有什么
应用程序运行并显示 rootViewController。让我们称之为 vCA。如果我将 rootViewController 设置为容器 viewController,我将拥有这个
应用程序运行并显示完全为空的 containerController,并且必须呈现旧的 vCA。在我看来,这是一个愚蠢的解决方案,我的意思是,提供一个空的 containerController 并将调用 vCA?
我该怎么做?
谢谢。
【问题讨论】:
【参考方案1】:您的问题有点令人困惑,因为您使用了“存在”一词,就像在模态 ViewController 中一样,但您还提到了包含会创建不同的解决方案。
这完全取决于您的应用。如果 ViewControllers 的一个分支只有纵向而另一个只有横向,那么使用包含可能会很困难,因为你在两者之间切换的那一刻。方向调用从父级传递给子级,但仅在发生旋转时才调用。因此,例如,您的手机处于纵向并且您正在查看纵向 VC,当您切换到横向 VC 时,它将以纵向显示,当您旋转设备时,方向调用将使其变为横向并防止它返回肖像。反过来也是一样。 有一个技巧可以强制设备通过每个 ViewController 的所有方向回调,从而强制旋转,但我不确定它是否适用于每个 ios 版本。您可以从其父视图(窗口)中删除 rootViewController 的视图并立即再次添加它,这将触发方向回调。因此,每次在子 ViewController 之间切换时,您都可以尝试这样做。
或者不使用包含,您可以使用纵向 VC 作为您的 rootViewController,创建横向 ViewController 并将其存储在某个位置以便它保留在内存中。当您需要显示景观 ViewController 时,您可以在 rootViewController 上模态显示它。如果您的自动旋转方法设置正确,它将改变状态栏的方向并以正确的方向显示 VC。当您关闭它时,方向将恢复为纵向。
已编辑:
我这里没有 Xcode,但我在记事本中快速输入了一些内容。这应该可以工作,它会强制设备切换方向,在这种情况下没有过渡。如果要使用动画,请查看 _landscapeVC 的 modalTransitionStyle 属性。
// In AppDelegate.h
PortraitViewController* _portraitVC;
LandscapeViewController* _landscapeVC;
// In AppDelegate.m
-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
_portraitVC = [[PortraitViewController alloc] init];
_landscapeVC = [[LandscapeViewController alloc] init];
self.window.rootViewController = _portraitVC;
[self.window makeKeyAndVisible];
-(void)showLandscape
[_portraitVC presentViewController:_landscapeVC animated:NO completion:^];
[UIApplication sharedApplication].statusBarOrientation = _landscapeVC.interfaceOrientation;
-(void)showPortrait
[_landscapeVC dismissViewControllerAnimated:NO completion:^];
[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
【讨论】:
谢谢。我已经尝试过了,但无法使其工作。如果您能提供一些代码,我将不胜感激。谢谢。 好吧,我添加了一小段代码。如果您需要像我认为的那样强制设备的方向,使用模态 ViewController 是更清洁的解决方案。 啊,你的意思是把它添加到委托中?我从没想过。谢谢。我一回到家就试试。以上是关于iOS - viewController 包含和自动旋转的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 应用程序中打开包含 PDF 文件的 ViewController 时出现奇怪的控制台输出
当中间 viewController 包含两个 viewController 时 UIKeyCommands 不起作用
如何在 iOS 中找到当前可见的 viewController
IOS在ViewController中以编程方式删除子视图的位置