【问题标题】:Round upper corners for UITableViewUITableView 的圆角
【发布时间】:2025-12-08 13:40:01
【问题描述】:

我正在尝试为UITableView 圆角。但是表格视图没有显示。这里有什么问题?

// 表格视图设置

lazy var tableView: UITableView = {
        let tv = UITableView()
        tv.delegate = self
        tv.dataSource = self
        tv.separatorStyle = .none
        tv.backgroundColor = .white
        tv.layer.masksToBounds = true
        tv.roundUpperCorners(radius: 12)
        return tv
    }()

//圆上角。

 func roundUpperCorners(radius: CGFloat) {
        let maskPath = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: [.topLeft, .topRight], cornerRadii: CGSize(width: radius, height: radius))
        let maskLayer = CAShapeLayer()
        maskLayer.frame = self.bounds
        maskLayer.path = maskPath.cgPath
        self.layer.mask = maskLayer
    }

【问题讨论】:

  • 当您尝试圆角时,您没有设置桌子的框架。设置好桌子的框架后尝试圆角。
  • 我正在设置约束。固定顶部、底部、左侧和右侧。

标签: ios uitableview


【解决方案1】:

根据 @Fahri Azimov 评论,您应该设置表格视图的框架,首先使用他的评论。如果仍然遇到问题,请使用以下代码。

根据我的代码,

myTblView.clipsToBounds = true
myTblView.layer.cornerRadius = 10 // Set As you want
myTblView.layer.maskedCorners = [.layerMinXMinYCorner,.layerMaxXMinYCorner]

注意:maskedCorners iOS 11 中的新功能,您可以从官方文档中阅读。

【讨论】:

  • maskedCorners 属性是什么?它是某种扩展吗?如果是这样,您应该提供代码,或提供对包含它的库的参考以提供帮助。
  • 这个可以定义maskedCorners的使用吗,苹果api文档里没有定义
  • 好的,感谢编辑,它仅适用于 iOS 11。
  • 这应该是正确的答案,其他解决方案失败,当 tableview 与 superview 的 bottomAnchor = 0 时。向下滚动时,表格视图的内容会被剪裁。
【解决方案2】:
extension UIView {
func roundCorners(_ corners:UIRectCorner, radius: CGFloat) {
    let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
    let mask = CAShapeLayer()
    mask.path = path.cgPath
    self.layer.mask = mask
}}

yourView.roundCorners([.topLeft,.topRight], radius: 5)

【讨论】:

  • 你的答案和问题中已经提出的有什么区别
【解决方案3】:

它正在工作。感谢 Fahri Azimov 提到“设置桌子框架后尝试圆角”。

我将这一行 tableView.roundUpperCorners(radius: 12) 移到 viewDidLayoutSubviews 中。

 override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        tableView.roundUpperCorners(radius: 12)
    }

【讨论】: