iOS开发资料收集

TableView Head Footer 不停留实现方式

2017-01-10  本文已影响162人  anddygon

系统默认的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")
    }
    
}
上一篇下一篇

猜你喜欢

热点阅读