一、没有 header、footer 的 tableView :
1.cell复用的tableView:
(1)OpeningRecordViewController.swift 文件 & OpeningRecordViewController.xib 文件
tableView.delegate = self
tableView.dataSource = self
//注册cell
let nib = UINib(nibName: "OpeningRecordCell", bundle: nil)
tableView.register(nib, forCellReuseIdentifier: "OpeningRecordCell")
//MARK: - UITableViewDelegate,UITableViewDataSource
extension OpeningRecordViewController: UITableViewDelegate,UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "OpeningRecordCell") as! OpeningRecordCell
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 165
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//去掉tableViewCell 点击效果 三个简单方法
//1.松开手选中颜色消失
tableView.deselectRow(at: indexPath, animated: true)
//2.点击没有颜色
let cell = tableView.cellForRow(at: indexPath)
cell?.selectionStyle = UITableViewCellSelectionStyle.none
//3.点击没有颜色
cell?.isSelected = false
if indexPath.row == 0 {//自然拼读绘本
} else if indexPath.row == 1{//高频词绘本
}
}
}
(2)自定义 OpeningRecordCell.swift 文件 & OpeningRecordCell.xib 文件
(3)备注:
- cell复用的tableView的样式,一般设置为plain,group会有上下的sectionHeader、sectionFooter
二、有 header、footer 的 tableView :
1.header复用的tableView:
(1)TeachingBookDetailController.swift文件:
- 注册header:
tableView.register(TeachingBookDetailHeaderView.classForCoder(), forHeaderFooterViewReuseIdentifier: "TeachingBookDetailHeaderView")
- 代理方法:
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "TeachingBookDetailHeaderView") as! TeachingBookDetailHeaderView
return headerView
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 45.0
}
(2)TeachingBookDetailHeaderView.swift 文件:
import UIKit
class TeachingBookDetailHeaderView: UITableViewHeaderFooterView {
var unitLabel: UILabel?
override init(reuseIdentifier: String?) {
super.init(reuseIdentifier: reuseIdentifier)
self.contentView.backgroundColor = UIColor.white
let label = UILabel.init(frame: CGRect.init(x: 0, y: 15, width: 85, height: 30))
label.backgroundColor = UIColor.hexColor(0xffc21e)
label.font = UIFont.boldSystemFont(ofSize: 15)
label.textColor = UIColor.white
label.textAlignment = NSTextAlignment.center
self.addSubview(label)
self.unitLabel = label
let maskPath = UIBezierPath.init(roundedRect: (self.unitLabel?.bounds)!, byRoundingCorners: UIRectCorner(rawValue: UIRectCorner.RawValue(UInt8(UIRectCorner.topRight.rawValue) | UInt8(UIRectCorner.bottomRight.rawValue))), cornerRadii: CGSize.init(width: 15, height: 15))
let maskLayer = CAShapeLayer.init()
maskLayer.frame = (self.unitLabel?.bounds)!
maskLayer.path = maskPath.cgPath
self.unitLabel?.layer.mask = maskLayer
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
三、有删除样式的cell:
注:只需要实现三个代理方法即可
func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
return .delete
}
func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
return "删除"
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
let model = dataSource.remove(at: indexPath.row)
tableView.beginUpdates()
tableView.deleteRows(at: [indexPath], with: .middle)
tableView.endUpdates()
weak var weakSelf = self
_ = delay(0.5, task: {
weakSelf?.tableView.reloadData()
})
}
四、问题:
- tableView在iOS11设备上,上拉加载更多的时候,会闪一下,掉下去,现实的并不是最后一个cell,这是为什么?
答:
主要原因是 reload 成功后会重新计算contentSize,由于每个cell根据内容多少会有不同的高度的误差。
iOS11以后tableview 的header footer cell 都默认开启Self-Sizing,使得原来默认高度是0,现在却变成了UITableViewAutomaticDimension
解决办法:
tableView.estimatedRowHeight = 0
tableView.estimatedSectionHeaderHeight = 0
tableView.estimatedSectionFooterHeight = 0
网友评论