没有混合层的圆形 UIView(带cornerRadius)

Posted

技术标签:

【中文标题】没有混合层的圆形 UIView(带cornerRadius)【英文标题】:Circular UIView (with cornerRadius) without Blended Layer 【发布时间】:2015-01-09 02:36:37 【问题描述】:

我正在尝试使下面的圆圈具有不透明的纯白色,其中cornerRadius 切断了 UIView。

UIView *circle = [[UIView alloc] initWithFrame:CGRectMake(i * (todaySize + rightMargin), 0, smallSize, smallSize)];
circle.layer.cornerRadius = smallSize/2;
circle.layer.borderWidth = 0.5;
circle.layer.backgroundColor = [UIColor whiteColor].CGColor;
circle.backgroundColor = [UIColor whiteColor];
[self addSubview:circle];

我尝试了一些方法,例如设置背景颜色和不透明,但没有任何运气。颜色混合图层仍然显示圆圈的周围是透明的。有人知道怎么解决吗?

【问题讨论】:

你必须解释你的意思或展示图片或其他东西。你试过circle.clipsToBounds = YES;吗? 【参考方案1】:

为避免在使用圆角时发生混合,需要在 drawRect 中进行舍入,而不是作为图层上的属性。在我正在开发的应用程序中,我需要具有圆形背景的 UICollectionView 单元格。当我使用 layer.cornerRadius 时,性能受到了巨大的打击。打开颜色混合图层会产生以下结果:

不是我所希望的,我希望这些单元格为绿色,表示没有发生混合。为此,我将 UIView 子类化为 RoundedCornerView。我的实现真的很简短:

import UIKit

class RoundedCornerView: UIView 
    static let cornerRadius = 40.0 as CGFloat

    override func drawRect(rect: CGRect) 
        let borderPath = UIBezierPath(roundedRect: self.bounds, cornerRadius: RoundedCornerView.cornerRadius)
        UIColor.whiteColor().set()
        borderPath.fill()
    

然后我将要舍入的视图设置为笔尖中的 RoundedCornerView。在那一点上运行产生了这个:

滚动非常流畅,不再发生任何混合。这样做的一个奇怪的副作用是视图的 backgroundColor 属性将为角落的排除区域着色,而不是视图的主体。这意味着 backgroundColor 应该设置为视图后面的任何内容,而不是所需的填充颜色。

【讨论】:

【参考方案2】:

尝试使用蒙版来避免混合和处理父/子背景颜色匹配。

override func layoutSubviews() 
    super.layoutSubviews()

    let maskLayer = CAShapeLayer()
    maskLayer.path = UIBezierPath(roundedRect: bounds, cornerRadius: 20).cgPath
    layer.mask = maskLayer

【讨论】:

【参考方案3】:

将视图上的clipsToBounds或图层上的masksToBounds设置为YES

【讨论】:

以上是关于没有混合层的圆形 UIView(带cornerRadius)的主要内容,如果未能解决你的问题,请参考以下文章

swift Swift - 在UIView上创建带阴影的圆形图像的扩展

保留蒙面 UIView 的阴影

Swift Left Side只有带边框的圆形按钮

使 UIView 的特定角为圆形

层的 UIView 的子层在 Storyboard 中显示为 @IBDesignable,但在模拟器中却没有

SB结合代码圆角