表格视图蒙版大小不正确?

时间:2018-06-21 05:46:42

标签: swift uitableview core-graphics uibezierpath cashapelayer

我正在尝试使用遮罩将表格视图的上角四舍五入。我为此添加了一个扩展到UITableView。

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)

但是,当“表格视图”的顶部被四舍五入时,蒙版的大小似乎不正确。表格视图的内容是动态的,因为添加和删除了单元格。第一个单元格会正确显示,但是当我滚动时,会显示正确数量的单元格,但看不到它们。我认为在添加单元格之前,已将蒙版绘制为表格视图的大小-我尝试将函数移至

func viewWillLayoutSubviews() {

但这并不会改变任何东西。另外,我尝试在数据加载后将函数添加到,但仍然无法执行任何操作。

Table View with Wrong Masking

1 个答案:

答案 0 :(得分:1)

尝试一下,工作

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