具有相同背景的多个ViewControllers

时间:2016-04-21 04:49:37

标签: ios swift

如何实现多个视图控制器中的背景图像?

在屏幕切换时,self.view.backgroundColor = UIColor(patternImage: UIImage(named: "file.png"))背景将与UIViewController一起移动。

是否可以将图像放在视图控制器下的单独图层上?

4 个答案:

答案 0 :(得分:2)

解决方案1 ​​

创建一个名为MyBackground的类:

class MyBackground {
   class func addBackgroundImage() {
        UIGraphicsBeginImageContext(self.view.frame.size)
        UIImage(named: "file")?.drawInRect(self.view.bounds)

        let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

        view.backgroundColor = UIColor(patternImage: image)
    }
}

如果您想在AViewController中拨打电话,只需拨打MyBackground.addBackgroundImage()

即可

解决方案2

创建一个名为MyViewController的ViewController:

class MyViewController: UIViewController {
   override func viewDidLoad() {
   super.viewDidLoad()
   addBackgroundImage()
}

func addBackgroundImage() {
            UIGraphicsBeginImageContext(self.view.frame.size)
            UIImage(named: "file")?.drawInRect(self.view.bounds)

            let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()

            UIGraphicsEndImageContext()

            view.backgroundColor = UIColor(patternImage: image)
        }
}

如果AViewController想要设置此图像,只需这样做:

AViewController: MyViewController //AViewController is a subclass of MyViewController

例如:我有一个图像调用background,我会将其设置为ViewController的背景图片:

enter image description here

如果我只是将它添加到一行,@startupthekid说:

enter image description here

如果我按照我的说法添加它:

enter image description here

答案 1 :(得分:1)

我认为您可以在容器视图控制器中设置背景,例如导航控制器,选项卡控制器,然后将所有视图控制器的背景设置为清除颜色。

答案 2 :(得分:0)

您应该在每个viewDidload

viewController中设置图片

更新:

您应该在每个视图控制器中设置,或者您可以设置为窗口。第二件事,如果您的背景使用不同的图像动态变化,那么如果每个viewcontroller的图像不同,您可以使用prepareforsegue方法将图像传递给nextviewcontroller。如果每个viewcontroller都有相同的图像,那么你可以将它设置为窗口。

:)

答案 3 :(得分:0)

更好的答案是使用UIAppearance。如果您不熟悉它,UIAppearance是您发送消息的代理协议,它会修改该类的后续实例。

例如,如果我有自定义按钮类RoundButton

RoundButton.appearance().titleFont = Font.Heavy(20)

在我的RoundButton课程中:

dynamic var titleFont: UIFont? {
    get { return self.titleLabel?.font }
    set { self.titleLabel?.font = newValue }
}

dynamic关键字非常重要。它用于Objective-c兼容性,通过UIAppearance设置不使用它的属性会导致崩溃。

您可以根据需要执行任意数量的自定义属性,并且在操作系统中已经有一些默认属性。

在您的情况下,您可以执行以下操作:

UIImageView.appearanceWhenContainedInInstancesOfClasses([MyCustomViewController.self)].customImage = UIImage(...)

您当然可以使用自定义视图控制器,但在我看来,UIApperance会将您的UI代码与控制器逻辑分开。

您可以实现所需行为的一种方法是UIViewController子类:

 class MyCustomViewController: UIViewController {
     private let backgroundImageView = UIImageView()

     dynamic var backgroundImage: UIImage? {
         get { self.backgroundImageView.image }
         set { self.backgroundImageView.image = newValue }
     }
 }

然后修改backgroundImage的外观实例上的MyCustomViewController属性。

MyCustomViewController.appearance().backgroundImage = ...

编辑:鉴于您的问题具有误导性,并且您想要一个永远不会在所有视图控制器中移动的共享图像,您只需将图像视图插入应用程序窗口即可:

if let window = UIApplication.sharedApplication().windows.first {
        let imageView = UIImageView(image: UIImage(named: "face-mask"))
        window.addSubview(imageView)
        imageView.frame = window.bounds
    }

如果您像我一样喜欢Autolayout,那么我会设置约束来将图像视图固定到窗口边缘。