如何在 loadView 中设置背景颜色?

Posted

技术标签:

【中文标题】如何在 loadView 中设置背景颜色?【英文标题】:How to set backgroundColor in loadView? 【发布时间】:2014-05-01 08:45:10 【问题描述】:

我想覆盖我的自定义视图控制器的loadView 方法,以便自定义正在显示的视图。对于该自定义视图,我想应用在 Storyboard 编辑器中设置的背景颜色。

例如,如果我像这样实现 loadView:

-(void)loadView
    self.view = [[MyCustomView alloc] init];
    //Do some initialisation work for the custom view
    //...

然后生成的视图具有黑色背景。但是,如果我只调用默认实现:

-(void)loadView
    [super loadView];

然后橙色背景颜色(见截图)被应用到视图。如何获得在 故事板编辑器 中设置的颜色?我想做这样的事情(伪代码):

-(void)loadView
    self.view = [[MyCustomView alloc] init];
    self.view.backgroundColor = [self colorThatWasSelectedInStoryboardEditor];
    //Do some initialisation work for the custom view
    //...

苹果如何在loadView的默认实现中实现这一点?

【问题讨论】:

设置颜色应该在viewDidLoad,而不是loadView 我不介意在viewDidLoad 中这样做。这对我来说非常好。我只希望背景颜色是用户在 storyboard editor(界面构建器)中选择的颜色。正如我上面的代码应该指出的那样,loadView 似乎是 Apple 的 默认实现将颜色应用于视图的地方。 我很困惑。为什么要做什么?如果您在代码中什么都不做,不应该自动设置颜色吗?我不使用IB,所以我不确定。但我认为,如果你不在代码中搞砸,在 IB 中设置东西会起作用。 如果我不触摸loadView,那么颜色会按预期自动设置。但是,由于我想使用MyCustomView 而不是默认的UIView,我必须覆盖loadView。是的,您会认为即使在覆盖loadView 时也会自动应用背景颜色。不会的。 IB 中没有办法告诉它视图应该是自定义类吗?还是仅适用于视图控制器而不适用于他们的视图? 【参考方案1】:

由于您显然真的想在这里使用“loadView”而不是“viewDidLoad”,ANDApple's documentation for loadView says NOT to call "super",您需要“隐藏”您在其他地方的自定义颜色。例如。 ViewController 中的其他一些视图(例如隐藏的?),它连接到 IBOutlet 并且您可以通过视图的“.backgroundColor”属性提取它。

或者您将需要通过 UIColor 之类的 "colorWithRed:green:blue:alpha:" 等良好的方法设置您的“.backgroundColor”属性。

【讨论】:

这不是重点。问题是如何检索在 Storyboard 编辑器中选择的颜色?换句话说,我如何实现[self colorThatWasSelectedInStoryboardEditor] 所以您在情节提要中设置了视图控制器视图的背景颜色,而在显示视图时它不会被应用? 是的,完全正确。但是因为在不覆盖loadView 时确实应用了颜色,所以我想我在loadView 的自定义实现中一定遗漏了一些东西。 我并不痴迷于使用loadView。我只是看不出我会如何从使用viewDidLoad 中受益。当然,我可以以编程方式设置颜色或从另一个视图中提取颜色,但由于我正在为 cocoacontrols.com 构建一个开源控件,因此我想正确地完成它。我认为如果没有看到在 Storyboard 编辑器中选择的背景颜色被应用,人们会感到困惑。由于loadView的默认实现可以做到,我仍然相信在子类中一定可以做到。 您可以在 Storyboard 中简单地将 ViewController 的视图的自定义类设置为您的 CustomView。你知道怎么做吗?【参考方案2】:

故事板中的所有视图都布置在viewWillAppear: 之前,这意味着在viewDidLoad 中您还没有它们。尝试将您的代码移至viewWillAppear:,或者甚至更好地移至viewWill/DidLayoutSubviews,而self.view.backgroundColor 将提供您在IB 中设置的代码。

要回答您评论中的问题,请转到 IB,选择您的视图,转到 Utilities(右)窗格下的 Identity Inspector 选项卡,并将自定义类设置为 MyCustomView。无需实现 loadView 即可。

例如一个UIView,我已经声明为自定义视图类AGBlurView

【讨论】:

如果这样做,我如何强制实例化 MyCustomView 而不是普通的 UIView?这就是 loadView 的用途。

以上是关于如何在 loadView 中设置背景颜色?的主要内容,如果未能解决你的问题,请参考以下文章

如何在卡片背景中设置多种不同的颜色

如何在html中设置网页背景颜色

如何在 TTTAtributedLabel 中设置范围的背景颜色

如何在OpenGL中设置背景颜色

如何在所有场景中设置导航栏背景颜色

如何在 NavigationView 中设置列​​表的背景颜色