在 Swift 2.3 中使用 Bezier Path 和 Storyboard 绘制一个只有两个圆角的矩形 [重复]

Posted

技术标签:

【中文标题】在 Swift 2.3 中使用 Bezier Path 和 Storyboard 绘制一个只有两个圆角的矩形 [重复]【英文标题】:Drawing a rectangle with only two rounded corners using Bezier Path and Storyboarding in Swift 2.3 [duplicate] 【发布时间】:2017-03-03 23:25:18 【问题描述】:

我有 Table View 和 5 个单元格,如下所述。目的是让topRoundedBorderCell 带有白色填充,并且只有TopLeftTopRight 边框是圆形的,然后可以灵活地根据需要添加任意数量的单元格,白色填充和方角,以根据需要添加任意数量的选项,最后bottomRoundedCornerCell 将有白色填充,只有BottomLeftBottomRight 圆角。创造一个带有圆角的长白盒子的错觉,适合与一组相关的所有选项。 如下所示。

故事板单元格分解:

当我运行应用程序时:

但是,正如您在第二张图片中看到的那样,只有 TopLeft 边框是圆形的,其余的仍然是方形的。

我在UIView 类型的两个单独类中使用贝塞尔路径roundedRect 方法,我通过Storyboard 分配给相应的views

顶部圆角边框视图:

class TopRectangleRoundedCornersView: UIView 

    override func awakeFromNib() 

        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: [UIRectCorner.TopLeft , UIRectCorner.TopRight], cornerRadii: CGSize(width:10.0, height:10.0))
        let mask = CAShapeLayer()
        mask.path = path.CGPath
        self.layer.mask = mask
        self.layer.backgroundColor = UIColor.whiteColor().CGColor //white fill
    


底部圆角边框视图:

class BottomRectangleRoundedCornersView: UIView 

    override func awakeFromNib() 
        let path = UIBezierPath(roundedRect: self.bounds,
                                byRoundingCorners: [UIRectCorner.BottomLeft, UIRectCorner.BottomRight], cornerRadii: CGSize(width: 10.0, height: 10.0))
        let mask = CAShapeLayer()
        mask.path = path.CGPath
        self.layer.mask = mask
        self.layer.backgroundColor = UIColor.whiteColor().CGColor //white fill
    

【问题讨论】:

由于 bounds.origin 始终为 0,0 并且您的左上角是唯一被舍入的角,这让我认为您的视图大小可能在调用 awakeFromNib 之后才设置。我不确定,但我会在那里设置一个断点,看看这是否属实。您还需要致电super.awakeFromNib() 如果这些视图正在调整大小(自动调整大小?),那么您需要重新创建路径。 是的,视图是自动调整大小的,这是否意味着我应该在渲染单元格时在我的表视图控制器中执行此操作? 最好在你的类中覆盖 UIView 的layoutSubviews 【参考方案1】:

在调整视图大小时,您需要调整路径。请参阅问题Is there a UIView resize event? 中的答案以获得一些好的建议。

我最喜欢的是建议将 didSet() 添加到视图的 bounds 属性中。

【讨论】:

非常感谢!这正是我所需要的。 类 BottomRectangleRoundedCornersView: UIView 覆盖 var bounds: CGRect didSet let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: [UIRectCorner.BottomLeft, UIRectCorner.BottomRight],cornerRadii: CGSize(width: 10.0, height: 10.0)) let mask = CAShapeLayer() mask.path = path.CGPath self.layer.mask = mask self.layer.backgroundColor = UIColor.whiteColor().CGColor //白色填充 正如你所建议的,我移动了我的代码以覆盖 var bounds: CGRect didSet // Do stuff here 而不是使用 awakeFromNib。现在效果很好! 很高兴为您提供帮助 :)

以上是关于在 Swift 2.3 中使用 Bezier Path 和 Storyboard 绘制一个只有两个圆角的矩形 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 XCode 8 Playgrounds 中使用 Swift 2.3?

使用 Swift 2.3 编译的模块无法在 Swift 3.0 中导入

在 Swift 2.3 中导航到 UIViewController

Firebase queryEqualToValue 在 Swift 2.3 中获取密钥

无法在 Swift 2.3 中编译 Siri 扩展

Swift 2.3 中没有这样的模块“UserNotifications”