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

时间:2011-12-28 19:41:52

标签: objective-c ios 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; } ,但这也没有用。关于我做错了什么的任何想法?

相关代码如下所示:

{{1}}

7 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:3)

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

修改

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

foreach ($ads as $ad){
  $adinsights = $ad->getInsights( array (
    AdsInsightsFields::INLINE_LINK_CLICKS
  ));

  foreach($adinsights as $a){
    echo $a->date_start . ' - ' . $a->date_stop . ': ' . $a->inline_link_clicks.PHP_EOL;
  }

}

答案 6 :(得分:-1)

我刚刚遇到了完全相同的问题。即使我在自定义初始化方法中设置正确的框架并将背景颜色设置为白色,以及在我的viewWillAppear方法中,也没有显示背景颜色。我也证实没有任何东西覆盖它。

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

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

_viewFrame CGRect已传入我的init方法。)

另一种选择是在- (void)viewDidLayoutSubviews中设置它,具体取决于您想要设置背景颜色的时间和方式。

说实话,我还不明白为什么设置viewDidAppear中的背景颜色,而它在init方法中不起作用,并且设置它的代码在两个地方都是相同的

希望这有帮助,

埃里克


<强>更新 它确实与视图的框架有关。当我在init方法中设置视图的框架时,在viewDidAppear中设置背景颜色不再具有所需的效果。如果我在创建子视图的构建方法之后设置视图的框架,那么甚至就是这种情况。所以真正的谜团是:在我创建视图的位置和显示的位置之间,视图生命周期中的哪些内容会导致视图的帧重置为不正确的内容?

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

...刁钻