[英]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.