UITableView

一、没有 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

你可能感兴趣的:(UITableView)