跨多个视图控制器使用共享背景视图的最佳做法是什么?

时间:2016-09-13 20:17:18

标签: ios swift uiview uiviewcontroller window

通常在我的应用中,我需要使用背景图像或带有渐变的自定义视图:

enter image description here

现在我只是定义一个BackgroundView类来渲染自己,但是我需要该项目,然后我将每个视图控制器的根视图作为该类的一个实例。这是一个不错的解决方案,但有一些用例是不够的。例如,如果我想让控制器逐渐淡出:

UIView.animate(withDuration: self.transitionDurationOut, animations: {
            self.view.alpha = 0
        }) { (Finished) in
        }

屏幕将淡入黑色(窗口的默认颜色)。我宁愿做到这一点,以便我可以淡化控制器的视图,以显示背景。我可以通过容器视图完成此操作,但我希望尽可能多地删除样板代码。是否有某种方法可以为窗口提供某种根视图,如果它的视图变得透明,它将出现在活动控制器后面?

3 个答案:

答案 0 :(得分:1)

通过将子类设置为视图控制器根视图,我认为您有一个非常好的解决方案。如何将清晰的子视图添加到视图控制器根视图并在该子视图而不是根视图上执行淡入淡出。

示例:

self.view = BackGroundView() // Gradient background

let fadeView = UIView()
fadeView.backgroundColor = UIColor.clearColor()

/* Add content to fadeView here */

self.view.addSubview(fadeView)

UIView.animate(withDuration: self.transitionDurationOut, animations: {
        self.view.fadeView = 0
    }) { (Finished) in
}

答案 1 :(得分:0)

这里有一些代码可以直接向窗口添加视图:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        // Let's add a background view to the window so that controllers can fade out without the screen turning black.
        let window = UIApplication.shared.windows.first
        let bgFrame = window?.frame ?? CGRect(0,0,0,0)
        let bgView = BackgroundView(frame: bgFrame)
        window?.insertSubview(bgView, at: 0)

        return true
    }

不确定是否存在性能影响或某些原因不执行此操作。我也不认为如果设备旋转,这将调整视图的大小。寻找输入。

答案 2 :(得分:0)

如果主要问题归结为淡出到后台视图,那么一个简单的解决方案就是在view层次结构的顶层以相同的背景显示淡入淡出

let coverView = UIView() // With custom background
coverView.alpha = 0.0
self.view.addSubview(coverView)
UIView.animate(withDuration: self.transitionDurationOut, animations: {
    coverView.alpha = 1.0
})

这样,对于淡入淡出的部分,您不必移动subviews,处理透明度或更改应用的整体结构。