YZTableViewAdapter 0.1.0

YZTableViewAdapter 0.1.0

Maintained by qyizhong.



  • By
  • qyz777

YZTableViewAdapter

CI Status Version License Platform

Introduction

YZTableViewAdapter是一个用来快速组装多种Cell的轻量级工具

Example

快速使用

1. 实现TableViewCellProvider协议

你需要用一个类来计算cell需要的高度以及提供cell的类名

class FirstCellProvider: TableViewCellProvider {
    
    var color = UIColor.red
    var model: InfoModel?
    
    var height: CGFloat = 40
    
    func cellHeight() -> CGFloat {
        return height
    }
    
    func cellClassName() -> String {
        return "FirstCell"
    }
    
    init(with model: InfoModel) {
        self.model = model
//        在这可以计算cell高度
        let contentHeight = model.content.boundingRect(with: CGSize.init(width: CGFloat.greatestFiniteMagnitude, height: 0), options: [.usesLineFragmentOrigin], attributes: nil, context: nil).height
        height += contentHeight
        height += 21
    }
    
}

2. 让你的Cell实现TableViewCellDataReceiver协议

class FirstCell: UITableViewCell, TableViewCellDataReceiver {
    
    func updateCell(with provider: TableViewCellProvider) {
        let p = provider as! FirstCellProvider
        backgroundColor = p.color
        let model = p.model!
        titleLabel.text = model.title
        contentLabel.text = model.content
    }

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        contentView.addSubview(titleLabel)
        contentView.addSubview(contentLabel)
        titleLabel.frame = CGRect.init(x: 11, y: 11, width: 120, height: 21)
        contentLabel.frame = CGRect.init(x: 11, y: 42, width: 300, height: bounds.height - 42)
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    lazy var titleLabel: UILabel = {
        let view = UILabel()
        view.textColor = .black
        return view
    }()
    
    lazy var contentLabel: UILabel = {
        let view = UILabel()
        view.textColor = .black
        return view
    }()

}

3. 组装不同的Cell提供给Adapter

adapter = TableViewAdapter.init(with: tableView)

let model = InfoModel()
var dataArray: [TableViewCellProvider] = []
for i in 0..<30 {
    if i % 2 == 0 {
        let p = FirstCellProvider.init(with: model)
        p.color = .lightGray
        dataArray.append(p)
    } else {
        let p = SecondCellProvider()
        p.color = .white
        dataArray.append(p)
    }
}

adapter?.reloadRowsData(by: dataArray)

使用Section

adapter = TableViewAdapter.init(with: tableView)

let model = InfoModel()
var dataArray: [[TableViewCellProvider]] = []
var d1: [TableViewCellProvider] = []
var d2: [TableViewCellProvider] = []
for i in 0..<30 {
    if i < 15 {
        let p = FirstCellProvider.init(with: model)
        p.color = .lightGray
        d1.append(p)
    } else {
        let p = SecondCellProvider()
        p.color = .white
        d2.append(p)
    }
}
dataArray.append(d1)
dataArray.append(d2)
adapter?.reloadSectionsData(by: dataArray)

使用TableViewDelegate或TableViewDataSource

实现adapter的tableViewDelegate协议即可

adapter?.tableViewDelegate = self

extension ViewController: UITableViewDelegate {
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print(indexPath.row)
    }
    
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        print(scrollView.contentOffset)
    }
    
}

Requirements

Swift >= 4.0

Installation

YZTableViewAdapter is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'YZTableViewAdapter'

Author

qyz777, [email protected]

License

YZTableViewAdapter is available under the MIT license. See the LICENSE file for more info.