如何在 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 中设置背景颜色?的主要内容,如果未能解决你的问题,请参考以下文章