设置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中设置背景颜色不再具有所需的效果。 如果我创建子视图的视图构建方法之后设置视图的框架,情况就是这样。 所以真正的谜团是:在我创建视图的位置和显示它的位置之间, 视图的生命周期中的哪些内容会导致视图的帧重置为不正确的内容?

所以,答案的确如此:只要您的框架设置正确并且您的视图可见,它就会起作用。 只需在整个视图的生命周期中检查视图的框架,以确保它是正确的。

整蛊……