2016-04-21 110 views
0

如何实现多个视图控制器中的背景图像?具有相同背景的多个ViewController

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

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

回答

0

你应该设置图像中的每个viewController

更新的viewDidload

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

:)

+0

当我切换到另一个屏幕时它不会移动吗?无论如何,我需要保持静止。 –

+0

哦,你想永久在后台永久静态图像?我的印象是你只是想要相同的背景。你应该澄清你的问题,在这种情况下你想要什么是非常不清楚的。并看到我的答案,我会更新它。 – barndog

+0

@jayåk不,它在切换时不会移动。检查我的更新回答你的问题。 – Lion

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

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

+0

我不得不采取一些问题,因为当你可以在一行中执行'UIImageView(image:UIImage(named:“some-image”))''时,你为什么会不必要地使用图形上下文? – barndog

+0

图片尺寸。如果你不这样做,图像会变成真实的大小,当它应用到模拟器屏幕时,看起来会很糟糕。 – Khuong

+0

我不同意,我从来没有与图像大小,模拟器或其他方面的问题。如果你设置'contentMode'和'frame',你应该没问题。 – barndog

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关键字是非常重要的。它用于通过UIAppearance不使用它的objective-c兼容性和设置属性将导致崩溃。

你可以根据需要做很多自定义属性,并且在操作系统中已经有一些默认的属性。

在你的情况,你可以这样做:

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 } 
    } 
} 

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

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,就像我一样,那么我会设置约束来将图像视图固定到窗口边缘。

0

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

相关问题