iOS:当视图背景颜色为清晰颜色时,图层背景颜色不显示

Posted

技术标签:

【中文标题】iOS:当视图背景颜色为清晰颜色时,图层背景颜色不显示【英文标题】:iOS: layer background color not showing when view background color is clear color 【发布时间】:2013-03-24 11:38:20 【问题描述】:

我有两个同级视图:一个灰色标签和一个绿色按钮,按钮在下面。出于某种原因,我需要将label.backgroundColor 设置为清除颜色并将label.layer.backgroundColor 设置为灰色。按钮颜色为绿色。我希望在屏幕上看到灰色(因为标签位于按钮顶部)。但我看到的只是绿色(按钮的颜色)。为什么?

编辑:相关代码

// in my custom cell
-(void)awakeFromNib

    [super awakeFromNib];

    // customize label
    _label.layer.cornerRadius = 5;
    _label.layer.backgroundColor = [UIColor grayColor].CGColor;
    _label.backgroundColor = [UIColor clearColor];
    _label.layer.masksToBounds = NO;


    // customize button        
    // show shadow and rounded corner at the same time

    _button.backgroundColor = [UIColor clearColor];
    _button.layer.backgroundColor = [UIColor greenColor].CGColor;
    _button.layer.masksToBounds = NO;
    _button.layer.cornerRadius = 10.0f;

    self.layer.masksToBounds = NO;
    self.layer.cornerRadius = 10.0f;
    self.layer.shadowOpacity = 0.5f;
    self.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:_button.bounds cornerRadius:10.0f].CGPath;
    self.layer.shadowOffset = CGSizeMake(0.0f, 4.0f);
    self.layer.shadowRadius = 2.0f;


【问题讨论】:

“出于某种原因” 什么原因?如果我们知道您的决定背后的理由,我们或许可以为您提供更好的帮助。 把相关代码放在这里:) 因为我需要在保持label.layer.masksToBounds = NO 的同时将标签的角变圆(否则滚动会严重卡顿)。因此我认为唯一的选择是设置label.layer.backgroundColor 而不是label.backgroundColor 你试试 button.backgroundColor?? iPatel,我试过了,但没有任何改变 【参考方案1】:

终于找到了解决办法:只需将这两行的顺序颠倒一下即可:

// both set to clear color eventually
_label.layer.backgroundColor = [UIColor grayColor].CGColor;
_label.backgroundColor = [UIColor clearColor];

到这里:

// both set to gray eventually
_label.backgroundColor = [UIColor clearColor];
_label.layer.backgroundColor = [UIColor grayColor].CGColor;

原因是对于 UILabel,(虽然不是 UIView,稍后会详细介绍)设置其背景颜色会将其图层的背景颜色设置为零。但是如果我们先设置标签背景颜色,然后再设置图层背景颜色,那么两者各走各的,那么我们会在屏幕上看到标签背景颜色。

但是对于 UIView 来说,情况就完全不同了:view 背景颜色和它的 layer 的背景颜色是一回事。因此,以最后一组为准。

但是,我在文档中找不到有关上述观察的任何信息。希望有人能介入并提供帮助。

【讨论】:

UIViews 是层支持的,视图和层不是两件事而是一件事。视图不会自己绘制,只会绘制图层,但是您可以配置视图和/或图层。 帕斯卡,我以前也是这么想的。但是就像我在这篇文章中所做的那样,至少对于背景颜色、视图和它的图层来说,它们的行为截然不同。 看似用于标签,但不适用于 UIView IIRC。 UIView 在- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 中绘制它的层,就像你配置它或它的层一样。 好的,但是 UILabel 怎么样?【参考方案2】:

不要忘记将视图的 isOpaque 值设置为 false。这在 IB 中默认为 true。

【讨论】:

以上是关于iOS:当视图背景颜色为清晰颜色时,图层背景颜色不显示的主要内容,如果未能解决你的问题,请参考以下文章

使用 CAGradientLayer 类更改 UiView IOS 的渐变背景图层颜色

iOS Swift - 如何更改表格视图的背景颜色?

更改 ScrollView SwiftUI 的背景颜色

更改 ScrollView SwiftUI 的背景颜色

UiView背景颜色不同[重复]

如何在iOS上仅在具有清晰颜色的模糊视图底部获得圆角?