跨多个视图控制器共享背景图像

Posted

技术标签:

【中文标题】跨多个视图控制器共享背景图像【英文标题】:Sharing a Background Image Across Multiple View Controllers 【发布时间】:2015-12-28 04:25:40 【问题描述】:

我正在使用 Xcode 在 Swift 中构建一个应用程序。我有一组5 images,我想将其用作所有视图控制器的背景。

我有10+ View Controllers,但我希望能够重复使用这些图像。

通常我会为我的所有视图控制器添加一个图像视图,并设置图像。

我会使用公共变量来更改显示的图像。但是在这个应用程序上,我有很多视图控制器,创建每个图像视图并不是很有效。

有什么方法可以让我做得更快吗?谢谢。

【问题讨论】:

您可以使用容器视图在每个视图控制器中重用相同的图像......或者可以创建一个全局图像变量,可以将其设置为每个视图控制器中的每个图像视图 很多方法,你可以用 .Xib 创建 UIView,然后将其设置为所有 VC 的背景 【参考方案1】:

与子类化相比,使用 swift 执行此操作的更好方法是编写扩展并在所有视图控制器中调用您的方法。

extension UIViewController

func setCustomBackgroundImage()

    self.view.backgroundColor = UIColor(patternImage: UIImage(named:"yourImageFromXcAssets")!)

    //or

    let bgImage = UIImageView(image: UIImage(named: "yourImageFromXcAssets"))
    self.view.addSubview(bgImage)


在您的视图控制器中,只需像常规 UIViewController 类方法一样调用它,

class ViewController: UIViewController 
override func viewDidLoad() 
    super.viewDidLoad()
    self.setCustomBackgroundImage()

或者用 Objective-C 在 UIViewController 上写一个类别

#import <UIKit/UIKit.h>

@interface UIViewController (customBackground)

- (void)setCustomBackgroundImage;

@end

#import "UIViewController+customBackground.h"

@implementation UIViewController (customBackground)

- (void)setCustomBackgroundImage
    [self.view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"yourImageFromXcAssets"]]];
    //or
    UIImageView *bgImage = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"yourImageFromXcAssets"]];
    bgImage.frame = self.view.frame;
    [self.view addSubview:bgImage];


@end

Objective C 也采用同样的方法,

 [self setCustomBackgroundImage]; 

我正在使用视图控制器扩展来管理我的应用中的所有样式、颜色和外观。

【讨论】:

【参考方案2】:

使用父 ViewController 子类化所有 10 多个视图控制器。

@interface ViewController : ParentViewController

从 ParentViewController 的 viewDidLoad 调用方法。

// 父视图控制器

-(void)viewDidLoad

[自创背景视图];

在 createBackgroundView 中,以编程方式创建 UIImageView,并使用公共变量填充它(根据您的要求)。

在你的 ViewController 的 viewDidLoad 中,调用 [super viewDidLoad];

// 10 多个 ViewController 之一

-(void)viewDidLoad

[超级viewDidLoad];

// 其余代码

【讨论】:

如何创建 ParentViewController?另外,如何确保背景图片位于所有其他项目的后面? 任何 ViewController 都会扩展 UIViewController。所以代替那个,让它扩展ParentViewController。 ParentViewController 将扩展 UIViewController。当您在 viewDidLoad 中定义某些内容时,它会首先被调用。因此,您的 backgroundView 将落后于所有其他视图。如果您愿意,我可以分享示例代码。【参考方案3】:

在一个类中创建一组全局变量:

class Images 
    static let image1 = UIImage(named: "image1.png")
    static let image2 = UIImage(named: "image2.png")
    static let image3 = UIImage(named: "image3.png")
    static let image4 = UIImage(named: "image4.png")
    static let image5 = UIImage(named: "image5.png")

    static var selectedImage = image1

现在选择图像,

Images.selectedImage = Images.image3

要设置背景,在每个VC中,设置:

imageView.image = Images.selectedImage

【讨论】:

以上是关于跨多个视图控制器共享背景图像的主要内容,如果未能解决你的问题,请参考以下文章

使用相同背景图像的具有多个场景的视图控制器 (UIViewController) 情节提要

在 iOS 的多个视图中使用 UINavigationController 中的固定背景图像?

UINavigationController 具有跨所有 ViewController 的统一背景

NavigationController 推送扭曲背景图像

在 Swift 中跨多个选项卡访问相同的视图模型

设置变异 TableViewController 的背景图像