在所有 ViewControllers swift ios 11 中添加背景图像的最佳实践

Posted

技术标签:

【中文标题】在所有 ViewControllers swift ios 11 中添加背景图像的最佳实践【英文标题】:Best practices to add background image in all ViewControllers swift ios 11 【发布时间】:2017-09-28 17:50:27 【问题描述】:

以前在 ios 10 上,我使用了以下代码,非常适合我。 我刚刚添加了带有特定颜色的 UIImage + UIView 的 UIView 。在 ios 11 上对其进行测试后,我发现一些屏幕在其余 UI 元素之上都有这个 ImageView,所以这有什么问题

 override func viewDidLoad() 
    super.viewDidLoad()

    configureView()


func configureView() 
    view.backgroundColor = UIColor.clear
    let backgroundImage = getBackgroundImage()
    view.addSubview(backgroundImage)
    view.sendSubview(toBack: backgroundImage)


func getBackgroundImage() -> UIView 
    let backgroundImage = UIImageView(frame: UIScreen.main.bounds)
    backgroundImage.image = UIImage(named: "lemons")
    backgroundImage.contentMode =  UIViewContentMode.scaleAspectFill

    let backgroundView = UIView(frame: UIScreen.main.bounds)
    backgroundView.backgroundColor = black
    backgroundImage.addSubview(backgroundView)

    return backgroundImage

【问题讨论】:

【参考方案1】:

如果您以编程方式创建视图控制器(意味着没有故事板或 nib),您可以像这样非常简单地添加背景图像:

class SomeViewController: UIViewController 

    override func loadView() 
        view = UIView()
        view.frame = UIScreen.main.bounds
        setBackground()
    

    func setBackground() 

        // set image
        let bg = UIImageView()
        bg.image = // some UIImage
        bg.frame = view.bounds
        bg.contentMode = .scaleAspectFill
        bg.clipsToBounds = true
        view.insertSubview(bg, at: 0)

        // set tint
        let tint = UIView()
        tint = view.bounds
        tint = UIColor.red
        tint = 0.5
        view.insertSubview(tint, at: 1)

    


请记住,当您以编程方式创建视图控制器时,您必须创建视图控制器的实际视图,即view = UIView()。此外,“核心”任务,例如设置背景图像,应该在loadView 中完成,而“finishing-touch”任务,或者您想要在视图控制器完全加载到内存后执行的任务,应该执行在viewDidLoad。当然,配置视图控制器的视图属性绝对不能留到最后。

【讨论】:

谢谢你,我会试试你的方法——这么多编码的原因——是我想在uiImage之上放置半透明视图。而且我并不总是以编程方式创建 viewContorller,也许只有少数以编程方式创建,其余来自情节提要,这可能是一团糟 我更新了答案以包含一个色调层。只要您在 0 处插入图像,在 1 处插入色调层,其他所有内容都将添加到它们之上。在我看来,让你的代码尽可能地模块化也是一种更好的做法。因此,不要尝试将图像和色调层合并到一个视图中,而是将它们分开,这样可以更轻松地进行未来的编辑,并且更容易发现错误。【参考方案2】:

configureView() 呼叫从viewDidLoad 移动到viewWillLayoutSubviews。后者的不便之处在于它在视图控制器的生命周期中被多次调用,因此使用 Bool 属性进行检查,这样您就只调用configureView()一次,第一次。

【讨论】:

【参考方案3】:

斯威夫特 4:

最好将它保存在辅助类中:

static func setBlurBackGround(_ vc:UIViewController)
        let imageView = UIImageView()
        imageView.image = #imageLiteral(resourceName: "BackGround")
        imageView.frame = dBounds
        vc.view.addSubview(imageView)
    

【讨论】:

以上是关于在所有 ViewControllers swift ios 11 中添加背景图像的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Swift 代表 - 新手 3 ViewControllers

在 Swift 中使用 UIPageViewController 水平滚动 ViewControllers 的按钮

Swift:在 ContainerView 中单击从 ViewControllers 到 ViewController 的 Storyboard 解决方案

在 Swift 中的 ViewControllers 和条件 segues 之间传递选定的行

Swift - viewControllers 之间的无限滚动

[iOS Swift4]如何支持 ViewControllers(模态和推送)