如何给UITableView Footer添加分隔线?顶部显示底部隐藏
首先得指出你代码里的一个小问题:在viewForFooterInSection方法里设置tableView.tableFooterView = footer是不合适的——这个属性是用来设置整个表的全局底部视图,而viewForFooterInSection返回的是单个section的footer视图,两者不要混淆,建议删掉这行代码,避免出现布局冲突。
接下来给你两种实现需求的方法:
方法一:自定义添加顶部分隔线(最直接)
既然要在footer顶部显示分隔线,我们可以直接给footer cell添加一个UIView作为分隔线,手动控制它的位置和样式,底部自然就不会有额外分隔线了。修改后的代码如下:
override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { let footerHeight: CGFloat = 50 let footer = UITableViewCell(frame: CGRect(x: 0, y: 0, width: tableView.frame.width, height: footerHeight)) // 添加顶部分隔线 let separatorHeight: CGFloat = 1 let separatorLine = UIView(frame: CGRect( x: 0, y: 0, width: tableView.frame.width, height: separatorHeight )) separatorLine.backgroundColor = tableView.separatorColor // 和系统分隔线颜色保持一致 footer.addSubview(separatorLine) // 添加你的label(调整y坐标避免被分隔线挡住) let label = UILabel(frame: CGRect(x: 0, y: separatorHeight, width: tableView.frame.width, height: footerHeight - separatorHeight)) label.text = "HELLO" label.textAlignment = .center label.textColor = UIColor.lightGray footer.addSubview(label) return footer }
方法二:适配屏幕旋转的AutoLayout写法(更健壮)
如果你的App需要支持屏幕旋转,用frame固定宽度会出现适配问题,推荐改用AutoLayout约束来实现,代码示例如下:
override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { let footer = UITableViewCell() footer.translatesAutoresizingMaskIntoConstraints = false // 创建顶部分隔线 let separatorLine = UIView() separatorLine.backgroundColor = tableView.separatorColor separatorLine.translatesAutoresizingMaskIntoConstraints = false footer.addSubview(separatorLine) // 创建文本label let label = UILabel() label.text = "HELLO" label.textAlignment = .center label.textColor = .lightGray label.translatesAutoresizingMaskIntoConstraints = false footer.addSubview(label) // 添加约束,确保布局自适应 NSLayoutConstraint.activate([ footer.heightAnchor.constraint(equalToConstant: 50), separatorLine.topAnchor.constraint(equalTo: footer.topAnchor), separatorLine.leadingAnchor.constraint(equalTo: tableView.leadingAnchor), separatorLine.trailingAnchor.constraint(equalTo: tableView.trailingAnchor), separatorLine.heightAnchor.constraint(equalToConstant: 1), label.topAnchor.constraint(equalTo: separatorLine.bottomAnchor), label.leadingAnchor.constraint(equalTo: footer.leadingAnchor), label.trailingAnchor.constraint(equalTo: footer.trailingAnchor), label.bottomAnchor.constraint(equalTo: footer.bottomAnchor) ]) return footer }
这两种方法都能实现「footer顶部显示分隔线、底部无分隔线」的需求,你可以根据自己的布局习惯选择。
内容的提问来源于stack exchange,提问作者Ivan Kisin
相关产品推荐
相关产品推荐

