我正在尝试使用遮罩将表格视图的上角四舍五入。我为此添加了一个扩展到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() {
但这并不会改变任何东西。另外,我尝试在数据加载后将函数添加到,但仍然无法执行任何操作。
答案 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
}
}