没有混合层的圆形 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上创建带阴影的圆形图像的扩展