UILabel背景颜色泄漏到边界

时间:2015-04-11 00:00:19

标签: ios objective-c uiview uilabel

我正在创建一个UILabel,我使用以下代码设置背景颜色和角半径:

self.scoreLabel.backgroundColor = [UIColor DISRed];// custom red`
self.scoreLabel.layer.masksToBounds = YES;
self.scoreLabel.layer.cornerRadius = self.scoreLabel.frame.size.width/2;
self.scoreLabel.layer.borderWidth = 8.0;
self.scoreLabel.layer.borderColor = [[UIColor DISNavy] CGColor];

然而,背景的颜色似乎泄漏到边框的边缘(见图)。有什么想法吗?有关如何修复的想法吗?

enter image description here

6 个答案:

答案 0 :(得分:4)

我也遇到了同样的问题。这是一个愚蠢的错误。如果是clipToBounds,我总是忘记勾选cornerRadius

所以,只需勾选Storyboard中UILabel的Clip to Bounds即可解决问题。

是的,我们还需要保留以下代码:

label.layer.masksToBounds = true

答案 1 :(得分:1)

我这样创建了UILabel,背景颜色似乎没有泄漏..

1)将此内容写入项目的.h文件中。

UILabel *label;

2)将此内容写入项目的.m文件中。

label=[[UILabel alloc]initWithFrame:CGRectMake(100, 300, 100, 100)];//Set frame of label in your viewcontroller.
[label setBackgroundColor:[UIColor redColor]];//Set background color of label.
[label setText:@"Label"];//Set text in label.
[label setTextColor:[UIColor blackColor]];//Set text color in label.
[label setTextAlignment:NSTextAlignmentCenter];//Set text alignment in label.
[label.layer setCornerRadius:50.0];//Set corner radius of label to change the shape.
[label.layer setBorderWidth:8.0f];//Set border width of label.
[label setClipsToBounds:YES];//Set its to YES for Corner radius to work.
[label.layer setBorderColor:[UIColor greenColor].CGColor];//Set Border color.
[self.view addSubview:label];//Add it to the view of your choice.

答案 2 :(得分:1)

我遇到了同样的问题,UIButton的背景颜色在其边缘边缘漏出。

不要在UIButton上设置UIButton背景颜色,而是在UIButton的图层上设置它。

替换:

self.scoreLabel.backgroundColor = [UIColor DISRed];// custom red`

有了这个:

self.scoreLabel.layer.backgroundColor = [[UIColor DISRed] CGColor];// custom red`

答案 3 :(得分:0)

可能是抗锯齿问题。您可以通过在角落周围添加贝塞尔曲线来更好地修复它。

CAShapeLayer *subLayer = [[CAShapeLayer alloc] init];
[subLayer setFillColor:[UIColor clearColor].CGColor];
[subLayer setStrokeColor:[UIColor whiteColor].CGColor];
[subLayer setLineWidth:1.0];
[subLayer setPath:[UIBezierPath bezierPathWithRoundedRect:imageView.bounds cornerRadius:imageView.layer.cornerRadius].CGPath];
[imageView.layer addSublayer:subLayer];

答案 4 :(得分:0)

对于那些仍然面临边框颜色泄漏问题的人: 通过下面的代码,请注意,您需要根据需要设置框架和边框宽度,我将位置设置为视图的中心

 let badgeSize: CGFloat = 10
 let redBadge = UIView(frame: CGRect(x: view.center.x, y:view.center.y, width: badgeSize, height: badgeSize))
 redBadge.layer.borderColor = UIColor.white.cgColor
 redBadge.layer.borderWidth = 2
 redBadge.backgroundColor = .red
 redBadge.layer.cornerRadius = badgeSize * 0.5
 redBadge.clipsToBounds = true
 redBadge.layer.masksToBounds = true
 redBadge.maskLayerOnView(radius: badgeSize * 0.5)
 view.addSubview(redBadge)

第二,我们需要在UIView上编写扩展名

extension UIView{
 func maskLayerOnView(radius: CGFloat){
   let maskLayer = CAShapeLayer()
   maskLayer.path = UIBezierPath(roundedRect: self.bounds,
                    byRoundingCorners: [.allCorners], 
                    cornerRadii: CGSize(width: radius, 
                    height: radius)).cgPath
   self.layer.mask = maskLayer
 }
}

此代码段消除了边界色,可以在任何类型的视图上复制这种行为。

有关详细说明,请参见this article

答案 5 :(得分:0)

好吧,答案很多...

我发现问题仍然存在,只要使用UIViews背景色而不是UIViews“图层”的背景色即可。另外,当然,需要启用屏蔽。

对于UICollectionViewCell子类,代码为:

- (void)prepare
{
    self.contentView.layer.backgroundColor = UIColor.redColor.CGColor;
    self.contentView.layer.cornerRadius = 25.0;
    self.contentView.layer.borderColor = UIColor.blackColor.CGColor;
    self.contentView.layer.borderWidth = 1.0;
    //Enable to optimize image views: self.contentView.layer.shouldRasterize = YES;
    //Enable to optimize image views: self.contentView.layer.rasterizationScale = UIScreen.mainScreen.scale;
    self.contentView.layer.masksToBounds = YES;
    self.contentView.clipsToBounds = YES;
}

要使背景色的设置更舒适且更不易出错,可以添加以下内容:

/*
 setBackgroundColor:

 */
- (void)setBackgroundColor:(UIColor *)p_BackgroundColor
{
    super.backgroundColor = nil;
    self.contentView.layer.backgroundColor = p_BackgroundColor.CGColor;

    self.contentView.layer.masksToBounds = YES;
    self.contentView.clipsToBounds = YES;
}