设置UIView子类的背景颜色无效

6

我正在尝试更改一个UIView子类的背景颜色。但是,在我的- (id)initWithFrame:(CGRect)frame方法内使用self.backgroundColor = [UIColor whiteColor];时,它似乎没有任何作用。这个视图始终是黑色的。我还尝试了从我的视图控制器中使用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;
}

要在UIVIew中初始化,您必须同时执行-initWithCoder:和initWithFrame:。这是iOS中的一个真正的坑! - Fattie
7个回答

8

如果这个视图是从xib文件中解档出来的,你需要重写-initWithCoder:方法。只有在程序化创建视图时,-initWithFrame:才会被调用。


8

我曾经遇到过同样的问题。我在layoutSubviews()中进行了钩子处理,它可以正常工作:

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

4

这表明视图没有设置框架。建议在initWithFrame:中设置断点以验证是否已调用。如果您调用... = [UIView alloc] init],那么这可能是您问题的源头。

编辑

如果确实调用了initWithFrame:,则可能是该视图被另一个视图覆盖,导致其看起来无法工作(因为您看不到它)或者视图本身处于隐藏状态。

排除故障的另一种方法是覆盖backgroundColor属性并设置断点。查找在调用堆栈中还有哪些内容正在更改颜色。


我尝试在方法中添加 NSLog(@"Hello");,它确实起作用了。 - Anders
更新的答案包括更多的故障排除提示。 - Jeremy
你说得对,这个视图被另一个视图遮挡了。是我犯了愚蠢的错误。但还是谢谢你! - Anders
如果视图没有设置框架,你会如何解决这个问题? - KerrM
@Kerrm,你可以给它设置一个框架;否则,我认为你不需要背景颜色。 - Jeremy
这个回答基本上是错误的。你应该使用-initWithCoder:,而不是使用initWithFrame。 - Fattie

2
您可以使用self.layer.backgroundColor代替:
mySubclassedView.layer.backgroundColor = UIColor.green.cgColor

此方法适用于UIViewController - Vyachaslav Gerchicov
@VyachaslavGerchicov 是哪个方法?如果你指的是 viewDidLoad() 方法,那么是的。我只是写了一个例子。每个 UIView 都有一个图层属性,它的 backgroundColor 可以被改变。 - Orkhan Alikhanov
问题是关于UIView子类,而你的答案是关于UIViewController子类的。因为它没有回答问题,所以被投了反对票。 - Vyachaslav Gerchicov
@VyachaslavGerchicov 这个答案与 UIViewController 没有任何关系。我写这个例子只是为了演示如何使用它。现在我将它简化成了一行代码。如果你想改变 UIView 子类的背景颜色,请使用它。如果代码不起作用(颜色没有改变),那么请点踩以表明这个答案是无用的。否则,它不应该被点踩。 - Orkhan Alikhanov

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

在设置背景颜色后,您能否记录一下它的值? - Nikita Ivaniushchenko

0
为什么不能在-viewDidLoad方法中实现self.backgroundColor = [UIColor whiteColor],而不是在-initWithFrame中?然后尝试self.backgroundColor = [UIColor whiteColor];以及self.myView.backgroundColor来查看哪个有效。

0

我刚遇到了这个完全相同的问题。即使我在自定义的初始化方法和viewWillAppear方法中设置了正确的框架并将背景颜色设置为白色,但背景颜色仍未显示出来。我还验证了没有任何东西覆盖它。

然后我找到了解决方案:我改为在viewDidAppear方法中设置背景颜色,一切都好了:

- (void)viewDidAppear:(BOOL)animated
{
   [self.view setBackgroundColor:[UIColor whiteColor]];
   self.view.frame = _viewFrame;
}

我的init方法中传递了_viewFrame CGRect。

另一个选项是在- (void)viewDidLayoutSubviews中设置它,具体取决于您希望何时以及如何设置背景颜色。

老实说,我还不明白为什么在init方法中设置背景颜色不起作用,而在viewDidAppear中起作用。两个地方设置的代码完全相同。

希望能帮到你,

Erik


更新: 它确实与视图的框架有关。当我在我的init方法中设置视图的框架时,然后在viewDidAppear中设置背景颜色不再具有期望的效果。即使我在创建子视图的视图构建方法之后设置了视图的框架,这也是如此。因此,真正的谜团是:在我完成创建视图并显示之间的那个点上,在视图的生命周期中发生了什么导致视图的框架被重置为不正确的值?

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

棘手...


这个方法是针对于UIViewController的,问题中的示例是针对于UIView的。 - Vyachaslav Gerchicov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接