UINavigationController 和备用景观

Posted

技术标签:

【中文标题】UINavigationController 和备用景观【英文标题】:UINavigationController and Alternate Landscape 【发布时间】:2011-05-22 22:23:59 【问题描述】:

在我的应用程序中,我使用了备用横向界面策略(将您的横向视图呈现为模式)。我还使用导航控制器进行转换,这会导致以下问题:我不知道如何从横向正确推送/弹出。

我想出了以下解决方案,但有人可能知道更好的解决方案。假设一个人只需要处理两个视图。我们称它们为 AP、AL、BP、BL,其中第二个字母代表方向。我们从一个内置 AP 的导航控制器开始。要在 AP 和 BP 之间切换,我们只需按下/弹出即可。为了从 AP 到 AL,我们展示了一个带有 AL 的模态导航控制器。为了在 AL 和 BL 之间切换,我们在 second 导航控制器内推/弹出。现在从 BP 到 BL,我们弹出 w/o 动画并呈现一个模态导航控制器,其中 BL 位于 AL 之上。要从 BL 转到 BP,我们关闭模态导航控制器并推送 BP w/o 动画。

看起来有点丑,但还不错。谁能想到更好的办法?

提前致谢!

【问题讨论】:

【参考方案1】:

是否有某些原因需要在单独的控制器中将横向显示为模态?当我的纵向和横向方向有两个完全不同的视图时,我会在它们之间消失,因为它们在旋转过程中会拉伸。

这允许在两个方向上提供截然不同的内容,它们之间的良好过渡以及在一个控制器下共享代码。

这是一些代码。当我们改变方向时,我们的 UIViewController 将在 portraitViewlandscapeView 之间切换。

portraitViewlandscapeView 都是 UIViewController 的 view 的子级。层次结构如下:

UIViewController
    |
     - view
        |
        |- portraitView
        |
        |- landscapeView

两者都有自己的 autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight 以确保它们在视图控制器旋转时拉伸。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

    if( orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight )
    
        [UIView animateWithDuration:duration
                         animations:^
                         
                             //Fade the landscape view over the top of the 
                             //portrait view as during rotation 
                             landscapeView.alpha = 1.0f;
                         
                         completion:^(BOOL finished)
                         
                             //Hide the portrait view when landscape is fully
                             //visible
                             portraitView.alpha = 0.0f
                         ];
    
    else
    
        //Show the portrait view (underneath the landscape view)
        portraitView.alpha = 1.0f;

        [UIView animateWithDuration:duration
                         animations:^
                         
                             //Fade out the landscape view to reveal the portrait view
                             landscapeView.alpha = 0.0f;
                         ];
    

您的控件和子视图将与相应的视图一起淡出和停用,让您拥有完全不同的内容。我最近使用它在改变方向时在两个不同的背景图像之间淡入淡出。效果很流畅。

您现在可以创建两个视图控制器,AB,它们分别管理两个视图,如上所述。然后,您可以像往常一样简单地推送视图控制器,而不必担心在旋转期间管理 UINavigationController 的视图控制器堆栈。

【讨论】:

也许你是对的,这是避免模态视图的好方法。我会等一会儿。如果没有更多的解决方案,我会接受你的。

以上是关于UINavigationController 和备用景观的主要内容,如果未能解决你的问题,请参考以下文章

iOS:如何在现有 UINavigationController 中打开另一个 UINavigationController?

带有主 UINavigationController 和详细 UINavigationController 的 UISplitViewcontroller

带有 UINavigationController 的 UITabBarController,在 hidesBottomBarWhenPushed 上隐藏 UINavigationController

在 UINavigationController 内的 UITabBarcontroller 中添加 UINavigationController?

UINavigationController 与 AppDelegate 中的 UISegmentedControl 切换 UINavigationController 的 rootviewcontr

从一个 UINavigationController 到另一个 UINavigationController (Swift iOS 9, xcode 7)