UIView 上的自定义圆角

Posted

技术标签:

【中文标题】UIView 上的自定义圆角【英文标题】:Custom Rounding corners on UIView 【发布时间】:2016-03-18 18:56:00 【问题描述】:

所以我一直坚持这个问题,在线阅读并尝试了许多不同的解决方案,但无法弄清楚我做错了什么。我想要完成的事情应该很简单:我有一个 UIView,我想把它的左下角和右下角弄圆,这样它们就会被剪裁而不是被绘制。

这是我目前所拥有的(vwView 是我在屏幕上自定义视图的出口):

var layerTest = CAShapeLayer()

var bzPath = UIBezierPath(roundedRect: vwView.bounds, byRoundingCorners: [.BottomLeft, .BottomRight], cornerRadii: CGSizeMake(10, 10) )
layerTest.path = bzPath.CGPath

vwView.layer.mask = layerTest;

我做错了什么?另外:这只是我的原型,因为我真的很想在 UITableViewCell 上执行此操作,所以如果我需要为此采取不同的方法,那也可能会有所帮助。

谢谢

詹姆斯

【问题讨论】:

似乎对我有用。你得到什么结果? 您是否尝试过设置图层的框架? layerTest.frame = vwView.bounds? 【参考方案1】:

问题是vwView 稍后会调整大小以适应屏幕,但您没有更新路径以适应其新大小。对此没有特别简单的解决方法。您基本上需要将vwView 设为自定义类(如果还没有的话)并更新layoutSubviews 中的掩码。示例:

public class RoundedBorderView: UIView 

    public var roundedCorners: UIRectCorner = [ .BottomLeft, .BottomRight ] 
        didSet  self.setNeedsLayout() 
    

    public var cornerRadii: CGSize = CGSizeMake(10, 10) 
        didSet  self.setNeedsLayout() 
    

    public override func layoutSubviews() 
        super.layoutSubviews()
        updateMask()
    

    private func updateMask() 
        let mask = maskShapeLayer()
        mask.path = UIBezierPath(roundedRect: bounds, byRoundingCorners: roundedCorners, cornerRadii: cornerRadii).CGPath
    

    private func maskShapeLayer() -> CAShapeLayer 
        if let mask = layer.mask as? CAShapeLayer 
            return mask
        
        let mask = CAShapeLayer()
        layer.mask = mask
        return mask
    


vwView的类更改为RoundedBorderView,它将保持自己的遮罩层。

【讨论】:

谢谢罗伯!这很好用,你的代码很棒!

以上是关于UIView 上的自定义圆角的主要内容,如果未能解决你的问题,请参考以下文章

如何在 touchesBegan 上的自定义 UIView 中调整 UILabel 位置?

在另一个视图控制器展开 segue 后重新加载 UIView 数据上的自定义 tableview

iOS绘制带有底部边框的自定义视图

更改自定义 UIView 上的选项卡

分组 UITableView 上的自定义背景图像

自定义 UIView 上的披露指示器 [重复]