系统默认的header,footer停留挺棒的,但是有时候项目里设计明确不停留,这个时候就比较蛋疼,实现的方式比较多,下面提供一种比较简单的实现方式。
思路:系统实现停留的方式是通过改变header,footer的frame.y来实现的,所以只需要按照我们的方式重写frame属性
tableview上的内容视图是按照左->右,上->下的方式布局的,所以tableview通过datasource确定数据之后每一个header,cell,footer,section都有了确定的frame了。
class TableViewHeaderFooterView: UIView {
enum Style {
case header, footer
}
/*当前header,footer所在的section的frame 通过UITableViewDelegate方法获取即可
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let rectForSection = tableView.rect(forSection: section)
let header = TableViewHeaderFooterView(rectForSection: rectForSection, style: .header)
header.backgroundColor = .red
return header
}
*/
fileprivate(set) var rectForSection: CGRect
fileprivate(set) var style: Style
override var frame: CGRect {
set{
let sectionRect = rectForSection
let top: CGFloat
switch style {
case .header:
top = sectionRect.minY
case .footer:
top = sectionRect.maxY - newValue.height
}
let newFrame = CGRect(x: newValue.minX, y: top, width: newValue.width, height: newValue.height)
super.frame = newFrame
}
get{
return super.frame
}
}
init(rectForSection: CGRect, style: Style) {
self.rectForSection = rectForSection
self.style = style
super.init(frame: .zero)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
网友评论