系統(tǒng)默認的header有决,footer停留挺棒的樱溉,但是有時候項目里設計明確不停留紫谷,這個時候就比較蛋疼齐饮,實現(xiàn)的方式比較多捐寥,下面提供一種比較簡單的實現(xiàn)方式。
思路:系統(tǒng)實現(xiàn)停留的方式是通過改變header祖驱,footer的frame.y來實現(xiàn)的握恳,所以只需要按照我們的方式重寫frame屬性
tableview上的內容視圖是按照左->右,上->下的方式布局的捺僻,所以tableview通過datasource確定數(shù)據(jù)之后每一個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")
}
}