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
}
}
我正在尝试使用蒙版将 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
}
}