我有一个其中有uiview的tablviewcell。
基于某种逻辑,我更改了背景颜色,并使左右角变圆了。

我从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的设备。

滚动表格视图后,它会再次正确地向后拉伸到所需的宽度。

如何解决这个问题呢 ?

最佳答案

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

所以...

为“圆角”视图创建一个UIView子类(简单示例):

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
    }
}


现在,只要视图更改大小(例如,首次使用或设备旋转时),该视图就会自动更新路径。

这是在表单元格中使用它的方式。在情节提要中,将“背景视图”的类设置为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

10-08 05:25