UINavigationController 具有跨所有 ViewController 的统一背景

Posted

技术标签:

【中文标题】UINavigationController 具有跨所有 ViewController 的统一背景【英文标题】:UINavigationController with unified background across all ViewControllers 【发布时间】:2014-10-28 14:42:02 【问题描述】:

我一直在玩弄UINavigationController 的想法,它有一个图像作为背景,并且堆栈上的每个视图控制器都将具有透明背景,因此UINavigationController 的背景图像在所有视图控制器中都是可见的。

我尝试以最明显的方式实现这一点(让根视图控制器具有全屏图像和具有透明背景的视图控制器,但这会导致动画出现尴尬的问题)。

四处挖掘,我发现 HotelTonight 应用程序设法实现了这一点。查看他们的用户界面的记录。我做了:https://www.youtube.com/watch?v=qvynwhCj5oM&list=UUKnxsyMsRRRJs_Yw9GZVOFw

有人对实现此功能的正确路径有什么建议吗?

【问题讨论】:

您的视频已隐藏。 抱歉,iMovie 将其设置为隐藏。现在已经修好了。 【参考方案1】:

最好将 UIViewController 子类化以对其背景和导航控制器样式进行特定设置。例如,在 UIViewController 子类的 viewDidLoad 方法中,将其背景设置为某个图像。您还可以使用它来设置导航栏的样式(barButtonItems 的某些颜色等)。然后,您创建的每个新视图控制器都是蒙皮视图控制器的子类。

如果你的背景是一张图片,当一个新的视图控制器滑入旧视图控制器的顶部时,你仍然会得到奇怪的动画效果;背景也会滑入。根据您希望如何自定义过渡动画,您可以做一些事情来在过渡期间使用视图。 UIPresentationController 可能会提供一些解决方案来制作更自定义的动画过渡。

编辑:为了模拟 Hotel now 应用程序,我制作了一个 UINavigationController,其背景为图像,顶部的控制器具有清晰的背景。在推动时,我在 segue 发生时将第一个控制器的 alpha 设置为 0。返回时,我将 alpha 设置回 1。

-(void)viewWillAppear:(BOOL)animated 
    [super viewWillAppear:animated];

    self.view.alpha = 1;


-(void)didClickButton:(id)sender 
    [UIView animateWithDuration:.25 animations:^
        self.view.alpha = 0;
    ];

    // the transition itself is a push segue defined in the storyboard

我相信酒店应用程序的背景很适合这种方法,因为它很暗。不确定它对于更明亮的应用程序或在控制器中包含大量内容的应用程序是否非常有效。

【讨论】:

你所描述的不会达到我所说的。看视频。我需要在堆栈上的所有视图控制器中拥有一个静态背景。 在我的 hotel now 应用程序上来回点击了很多次后,我看到了两件事:1)我认为第一个控制器的内容正在淡出并很快恢复。 2)当第二个屏幕出现时,我实际上短暂地看到了第一个屏幕的阴影。所以我相信他们正在淡出第一个屏幕的内容,同时将第二个屏幕推入堆栈。我能够通过在推动新控制器的控制器上进行动画 alpha 淡入淡出来复制这一点。

以上是关于UINavigationController 具有跨所有 ViewController 的统一背景的主要内容,如果未能解决你的问题,请参考以下文章

具有奇怪行为的 UINavigationController

将 UINavigationController 与具有透明背景的 UIViewController 一起使用

具有嵌套 UINavigationController 的应用程序在 iOS SDK 4.2 中崩溃

是否每个具有“编辑”或“完成”按钮的视图都​​需要位于 UINavigationController 中?

从UINavigationController中解除具有自定义转换的UIViewController时出现黑屏

UINavigationController 上视图之间的过渡动​​画有多长?