如何移除.insetGrouped样式UITableView中指定section或row的内边距
针对.insetGrouped样式UITableView移除指定section内边距的实现方案
可以实现,以下是两种常用的稳定实现方案,均可保留全局.insetGrouped样式,仅修改首个section的边距效果:
方案1:负边距抵消系统内边距(推荐,改动最小)
仅需调整首个section内部视图的约束,完全不影响其他section的默认圆角、边距样式:
- 给首个section cell内的collectionView添加约束时,左右约束不要绑定到cell的
contentView,直接绑定到cell本身的左右边缘,即可抵消系统自动添加的section内边距:
collectionView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ collectionView.topAnchor.constraint(equalTo: cell.contentView.topAnchor), collectionView.bottomAnchor.constraint(equalTo: cell.contentView.bottomAnchor), // 左右约束绑定到cell而非contentView,自动抵消系统inset collectionView.leadingAnchor.constraint(equalTo: cell.leadingAnchor), collectionView.trailingAnchor.constraint(equalTo: cell.trailingAnchor) ])
- 可选配置:如果不需要首个section展示分隔线,可在
cellForRowAt中单独隐藏:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "你的cellID", for: indexPath) if indexPath.section == 0 { cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: .greatestFiniteMagnitude) } // 其余cell配置逻辑 return cell }
方案2:自定义section边距(适合复杂布局需求)
如果需要更灵活的控制多section的边距规则,可通过代理方法重写指定section的内边距:
- 实现
UITableViewDelegate的insetForSectionAt代理方法,单独修改首个section的边距:
func tableView(_ tableView: UITableView, insetForSectionAt section: Int) -> UIEdgeInsets { if section == 0 { // 首个section左右内边距设为0,上下间距可根据业务需求调整 return UIEdgeInsets(top: 0, left: 0, bottom: 16, right: 0) } // 其他section保留系统默认insetGrouped边距 return UIEdgeInsets(top: 0, left: 16, bottom: 16, right: 16) }
- 重写边距后系统默认的
.insetGrouped圆角会失效,需要手动为其他section的cell添加圆角效果:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { guard indexPath.section != 0 else { return } let rowCount = tableView.numberOfRows(inSection: indexPath.section) var cornerMask: CACornerMask = [] // section首行加上角圆角 if indexPath.row == 0 { cornerMask.insert([.layerMinXMinYCorner, .layerMaxXMinYCorner]) } // section末行加下角圆角 if indexPath.row == rowCount - 1 { cornerMask.insert([.layerMinXMaxYCorner, .layerMaxXMaxYCorner]) } cell.layer.cornerRadius = 10 cell.layer.maskedCorners = cornerMask cell.clipsToBounds = true }
内容的提问来源于stack exchange,提问作者dan
相关产品推荐
相关产品推荐

