繁体   English   中英

设置UIView子类的背景颜色不起作用

[英]Setting background color of UIView subclass doesn't work

我正在尝试更改我的一个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;
}

我有同样的问题。 我迷上了layoutSubviews() ,它工作正常:

override func layoutSubviews() {
    super.layoutSubviews()
    self.backgroundColor = UIColor.clearColor()
}

如果要从xib取消归档此视图,则需要覆盖-initWithCoder: . -initWithFrame:仅在以编程方式创建视图时才会调用。

这表示视图没有设置框架。 我建议在initWithFrame:设置断点initWithFrame:验证它是否被调用。 如果您打电话,比如说, ... = [UIView alloc] init] ,那么这可能是您问题的根源。

编辑

如果实际上正在调用initWithFrame:那么该视图可能会被另一个视图覆盖,从而使其看起来不起作用(因为您没有看到它)或者视图本身是隐藏的。

另一种排除故障的方法是覆盖backgroundColor属性并设置断点。 找出callstack中正在改变颜色的其他内容。

你用什么方法调用self.myView.backgroundColor? 你确定,它是在viewDidLoad之后:? 但是,不知道你的第一种方法有什么问题。 你能展示更多代码吗?

您可以使用self.layer.backgroundColor

mySubclassedView.layer.backgroundColor = UIColor.green.cgColor

你为什么不能执行self.backgroundColor = [UIColor whiteColor]-viewDidLoad方法,而不是-initWithFrame 然后尝试self.backgroundColor = [UIColor whiteColor]; 以及self.myView.backgroundColor以查看哪些有效。

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

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

整蛊......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM