设置UIView子类的背景颜色不起作用
我正在尝试更改我的一个UIView子类的背景颜色。 由于某种原因, self.backgroundColor = [UIColor whiteColor];
当我把它放在我的- (id)initWithFrame:(CGRect)frame
方法中时,它没有做任何事情。 视图总是黑色的。 我也从我的视图的控制器尝试了self.myView.backgroundColor ...
但是这也没有用。 关于我做错的任何想法?
相关代码如下所示:
[...] @interface PaperView : UIView [....] [...] @implementation PaperView [...] - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [...] // Initialization code self.backgroundColor = [UIColor whiteColor]; // This doesn't do anything, the view is always black. } return self; }
这表示视图没有设置框架。 我建议在initWithFrame:
设置一个断点initWithFrame:
validation它是否被调用。 如果您打电话,比如说, ... = [UIView alloc] init]
,那么这可能是您问题的根源。
编辑
如果实际上正在调用initWithFrame:
那么视图可能被另一个视图覆盖,使得它看起来不起作用(因为你没有看到它)或者视图本身是隐藏的。
另一种排除故障的方法是覆盖backgroundColor属性并设置断点。 找出callstack中正在改变颜色的其他内容。
如果从xib中取消归档此视图,则需要覆盖-initWithCoder:
. -initWithFrame:
仅在以编程方式创建视图时调用。
我有同样的问题。 我迷上了layoutSubviews()
,它工作正常:
override func layoutSubviews() { super.layoutSubviews() self.backgroundColor = UIColor.clearColor() }
你用什么方法调用self.myView.backgroundColor? 你确定,它是在viewDidLoad之后:? 但是,不知道你的第一种方法有什么问题。 你能展示更多代码吗?
为什么不能在-viewDidLoad
方法中实现self.backgroundColor = [UIColor whiteColor]
而不是-viewDidLoad
? 然后尝试self.backgroundColor = [UIColor whiteColor];
以及self.myView.backgroundColor
以查看哪些有效。
您可以使用self.layer.backgroundColor
:
mySubclassedView.layer.backgroundColor = UIColor.green.cgColor
我刚才遇到了同样的问题 。 即使我在自定义init方法中设置了正确的帧并将背景颜色设置为白色,以及在我的viewWillAppear
方法中,也没有显示背景颜色。 我也证实没有任何东西覆盖它。
然后我找到了解决方案 :我在viewDidAppear
设置了背景颜色,而且一切都很好:
- (void)viewDidAppear:(BOOL)animated { [self.view setBackgroundColor:[UIColor whiteColor]]; self.view.frame = _viewFrame; }
( _viewFrame
CGRect已传入我的init方法。)
另一种选择是将其设置在- (void)viewDidLayoutSubviews
,具体取决于您何时以及如何准确设置背景颜色。
说实话,我还不明白为什么在viewDidAppear
设置背景颜色虽然在init方法中不起作用,但是设置它的代码在两个地方都是相同的。
希望这可以帮助,
埃里克
更新:它确实与视图的框架有关 。 当我在init方法中设置视图的框架时,在viewDidAppear中设置背景颜色不再具有所需的效果。 如果我在创建子视图的视图构建方法之后设置视图的框架,情况就是这样。 所以真正的谜团是:在我创建视图的位置和显示它的位置之间, 视图的生命周期中的哪些内容会导致视图的帧重置为不正确的内容?
所以,答案的确如此:只要您的框架设置正确并且您的视图可见,它就会起作用。 只需在整个视图的生命周期中检查视图的框架,以确保它是正确的。
整蛊……