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:当视图背景颜色为清晰颜色时,图层背景颜色不显示的主要内容,如果未能解决你的问题,请参考以下文章