Table View Mask 大小不正确?

Table View Mask not sizing correctly?

我正在尝试使用蒙版将 table 视图的顶角圆化。为此,我向 UITable 视图添加了一个扩展。

extension UITableView {


func roundCorners(corners:UIRectCorner, radius: CGFloat) {

    DispatchQueue.main.async {
        let path = UIBezierPath(roundedRect: self.bounds,
                                byRoundingCorners: corners,
                                cornerRadii: CGSize(width: radius, height: radius))
        let maskLayer = CAShapeLayer()
        maskLayer.frame = self.bounds
        maskLayer.path = path.cgPath
        self.layer.mask = maskLayer
    }
}
}

在 ViewDidLoad 函数中,我调用

tableView.roundCorners(corners: [.topRight,.topLeft], radius: 15)

然而,虽然 Table 视图的顶部是圆形的,但遮罩的尺寸似乎不正确。 table 视图的内容是动态的,因为单元格会被添加和删除。第一个单元格正确显示,但是当我滚动时显示正确数量的单元格,但看不到它们。我认为在添加单元格之前,遮罩被绘制到 table 视图大小 - 我已尝试将功能移动到

func viewWillLayoutSubviews() {

但这并没有改变任何东西。另外,我尝试在加载数据后添加函数,但仍然没有任何作用。

试试这个,工作

class ViewController: UIViewController, UITableViewDataSource {
    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.reloadData()
        tableView.addObserver(self, forKeyPath: "contentSize", options: [NSKeyValueObservingOptions.new], context: nil)
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        tableView.roundCorners(corners: [.topRight,.topLeft, .bottomRight, .bottomLeft], radius: 15)
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 30
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!

        return cell
    }
}

extension UITableView {
    func roundCorners(corners: UIRectCorner, radius: CGFloat) {
        let rect = CGRect(x: 0, y: 0, width: contentSize.width, height: contentSize.height)
        let path = UIBezierPath(roundedRect: rect,
                            byRoundingCorners: corners,
                            cornerRadii: CGSize(width: radius, height: radius))
        let maskLayer = CAShapeLayer()
        maskLayer.frame = rect
        maskLayer.path = path.cgPath
        self.layer.mask = maskLayer
    }
}