Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 跨多个视图控制器使用共享背景视图的最佳实践是什么?_Ios_Swift_Uiview_Uiviewcontroller_Window - Fatal编程技术网

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

Ios 跨多个视图控制器使用共享背景视图的最佳实践是什么?,ios,swift,uiview,uiviewcontroller,window,Ios,Swift,Uiview,Uiviewcontroller,Window,通常,在我的应用程序中,我需要使用背景图像或具有渐变的自定义视图,如下所示: UIView.animate(withDuration: self.transitionDurationOut, animations: { self.view.alpha = 0 }) { (Finished) in } 现在我只是定义一个BackgroundView类,该类根据项目的需要呈现自己,然后我将每个视图控制器的根视图作为该类的实例。这是一个不错的

通常,在我的应用程序中,我需要使用背景图像或具有渐变的自定义视图,如下所示:

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

现在我只是定义一个
BackgroundView
类,该类根据项目的需要呈现自己,然后我将每个视图控制器的根视图作为该类的实例。这是一个不错的解决方案,但在某些用例中,这是不够的。例如,如果我想使控制器像这样淡出:

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

屏幕将淡入黑色(窗口的默认颜色)。我宁愿这样做,这样我可以淡出控制器的视图来显示背景。我可以用容器视图来实现这一点,但我希望尽可能多地删除样板代码。有没有办法给窗口一个根视图,如果它的视图变得透明,它将出现在活动控制器的后面?

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

例如:

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
}

下面是一些将直接向窗口添加视图的代码:

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
    }

不确定是否存在性能影响或不这样做的原因。如果设备旋转,我也不认为这会调整视图的大小。正在查找输入。

如果主要问题归结为淡入背景视图,那么一个简单的解决方案是淡入位于
视图层次结构顶部具有相同背景的视图


这样,对于淡出的部分,你不必移动
子视图
,处理太多的透明度或更改应用程序的整体结构。

是的,我考虑过使用容器视图,但我不想破坏我的视图层次结构。不过这是一个可行的解决方案,所以请投赞成票。