如何在 Swift 中设置 UITableView 的左右边距

Sha*_*ToD 3 uitableview ios swift

我在控制器中使用UITableView来显示带有一些信息(标题、副标题和图像)的单元格。我想向tableView添加一些填充,但我找不到正确的解决方案。这是我的表视图代码:

private let tableView: UITableView = {
    let tableView = UITableView(frame: .zero, style: .grouped)
    tableView.translatesAutoresizingMaskIntoConstraints = false
    tableView.backgroundColor = .clear
    tableView.separatorStyle = .none
    tableView.allowsSelection = false
    tableView.showsVerticalScrollIndicator = false
    tableView.estimatedRowHeight = 44.0
    tableView.rowHeight = UITableView.automaticDimension
    return tableView
}()
Run Code Online (Sandbox Code Playgroud)

在viewDidLoad()内部,我为该tableView设置了约束

NSLayoutConstraint.activate([
    tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
    tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
    tableView.topAnchor.constraint(equalTo: view.topAnchor),
    tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])
Run Code Online (Sandbox Code Playgroud)

现在我的观点是这样的:

在此输入图像描述

现在,当我尝试通过添加以下内容在tableView闭包中配置contentInset属性时:

tableView.contentInset = .init(top: 0, left: 23.5, bottom: 0, right: -23.5)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它只在左侧添加了空间,但是查看调试视图层次结构 ,我可以说它将contentView移到了右侧(它仍然与其超级视图具有相同的宽度) 在此输入图像描述

在此输入图像描述

来自视图调试器的信息。 表格视图

<UITableView: 0x7fba82016000; frame = (0 0; 390 844); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x60000023de90>; layer = <CALayer: 0x600000c4b9e0>; contentOffset: {-23.333333333333332, -47}; contentSize: {390, 635.66666666666663}; adjustedContentInset: {47, 23.5, 34, -23.5}; dataSource: <Myapp.WelcomeViewController: 0x7fba81c08f60>>
Run Code Online (Sandbox Code Playgroud)

和第一个单元格:

<UITableViewCellContentView: 0x7fba84021250; frame = (0 0; 390 87); gestureRecognizers = <NSArray: 0x6000002cf900>; layer = <CALayer: 0x600000c2b900>>
Run Code Online (Sandbox Code Playgroud)

TableView与单元格具有相同的宽度(390 与 390)。如何将填充添加到tableView 的左侧和右侧,而不对该tableView进行约束(我希望该区域也可以滚动)

Don*_*Mag 6

您可以通过.layoutMargins在单元格上设置 来完成此操作contentView(在单元格类本身或在cellForRowAt

cell.contentView.layoutMargins = .init(top: 0.0, left: 23.5, bottom: 0.0, right: 23.5)
Run Code Online (Sandbox Code Playgroud)

或者在表视图本身上:

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.layoutMargins = .init(top: 0.0, left: 23.5, bottom: 0.0, right: 23.5)
    // if you want the separator lines to follow the content width
    tableView.separatorInset = tableView.layoutMargins
}
Run Code Online (Sandbox Code Playgroud)