UIBezierPath 无法正确呈现

UIBezierPath not rendering properly

我有一个 tablviewcell,里面有 uiview。 根据一些逻辑,我更改了背景颜色并使左右角变圆。

我通过 cellForRowat indexPath 函数使这些视图转角。

这是我的分机。

extension UIView {
    func roundCorners(corners: UIRectCorner, radius: CGFloat) {
        let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        layer.mask = mask
    }
}

以及我如何使用它

cell?.myCustomView.roundCorners(corners: [.bottomRight,.bottomLeft], radius: 10.0)

iphone宽度为375时正常, 但它无法更新宽度大于 375 的设备。

并且在滚动 tableview 之后,它再次正确地拉伸回所需的宽度。

如何解决这个问题?

您想在视图改变大小时更新路径。在 cellForRowAt 中,单元格尚未通过自动布局完全布局。

所以...

为您的 "rounded corners" 视图创建一个 UIView 子class(简单示例):

class RoundedCornersView: UIView {

    var corners: UIRectCorner = UIRectCorner()
    var radius: CGFloat = 0.0

    override func layoutSubviews() {
        super.layoutSubviews()
        let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        layer.mask = mask
    }
}

现在,只要视图改变大小 - 例如首次使用或设备旋转时 - 视图将自动更新路径。

下面是如何在 table 单元格中使用它。在 Storyboard 中,将 "background view" 的 class 设置为 RoundedCornersView

class RoundedCornersView: UIView {

    var corners: UIRectCorner = UIRectCorner()
    var radius: CGFloat = 0.0

    override func layoutSubviews() {
        super.layoutSubviews()
        let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        layer.mask = mask
    }
}

class MyTestCell: UITableViewCell {

    @IBOutlet var myCustomView: RoundedCornersView!

}

然后,在cellForRowAt

        let cell = tableView.dequeueReusableCell(withIdentifier: "MyTestCell", for: indexPath) as! MyTestCell

        if shouldBeRounded {
            cell.myCustomView.corners = [.bottomRight, .bottomLeft]
            cell.myCustomView.radius = 10.0
            cell.myCustomView.backgroundColor = .green
        } else {
            cell.myCustomView.corners = []
            cell.myCustomView.radius = 0.0
            cell.myCustomView.backgroundColor = .white
        }

        return cell

使用这个:

override func draw(_ rect: CGRect) {
    super.draw(rect)
    selectedView.roundCorners(corners: [.topLeft, .topRight], radius: 12.0)
}