【问题标题】:What is the best practice for using a shared background view across multiple view controllers?跨多个视图控制器使用共享背景视图的最佳实践是什么?
【发布时间】:2016-09-13 20:17:18
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios swift uiview uiviewcontroller window


    【解决方案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
    }
    

    【讨论】:

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

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

    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
        }
    

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

    【讨论】:

      【解决方案3】:

      如果主要问题归结为淡入背景视图,一个简单的解决方案是viewhierarchy 顶部淡入具有相同背景的视图时间>。

      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,处理太多的透明度或更改应用程序的整体结构。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-04
        • 2013-12-28
        • 2020-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多