UITableView 動態(tài)高度計算

  • 一. 設(shè)置 estimatedRowHeight

一般來講計算cell的高度需根據(jù)數(shù)據(jù)模型的內(nèi)容長度锌钮,決定單元格高度漏益,按照常規(guī)的方式鳍征,需要先給出單元格高度搁料,代理才會執(zhí)行cellForRow函數(shù)狼讨,如果height為0的話贝淤,cellForRow函數(shù)就不執(zhí)行了,而我們的計算卻發(fā)生在cellForRow函數(shù)中政供,計算完成后再刷新播聪,但是這樣不可行。

正確方式: 首先設(shè)置tableView的預(yù)估高度布隔,這樣的話离陶,代理就會首先執(zhí)行cellForRow函數(shù),這樣就可以先計算执泰,計算完成后保存起來枕磁,然后再執(zhí)行heightForRow函數(shù),讀取剛才保存的值术吝。

    tableView.estimatedRowHeight = 500
  • 二. 設(shè)置 beginUpdates 以及 endUpdates 函數(shù)

對于cell中有按鈕或者其他出發(fā)事件時動態(tài)修改cell高度的情況计济,可以在觸發(fā)事件中調(diào)用 beginUpdatesendUpdates 兩個函數(shù),該函數(shù)的作用區(qū)別于調(diào)用 reloadData排苍,刷新時只會更新高度沦寂,而不會重新調(diào)用 cellForRow 函數(shù)。

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.beginUpdates()
        let key = String(format: "ip:(%u,%u)", indexPath.section, indexPath.row)
        allHeight[key] = 200
        tableView.endUpdates()
    }

example

  • vc
import UIKit

class TestVC: UIViewController {
    
    public var allHeight = [String: CGFloat]()
    
    lazy var tableView: UITableView = {
        let temp = UITableView()
        temp.delegate = self
        temp.dataSource = self
        temp .register(TestTableViewCell.self, forCellReuseIdentifier: TestTableViewCell.description())
        return temp
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.frame = view.bounds
        view.addSubview(tableView)
        
        tableView.estimatedRowHeight = 500;
        tableView.reloadData()
    }
}

extension TestVC: UITableViewDelegate, UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        debugPrint("cellForRowAt")
        
        guard let cell = tableView.dequeueReusableCell(withIdentifier: TestTableViewCell.description(), for: indexPath) as? TestTableViewCell else { return UITableViewCell() }
        
        cell.content = "獲取 = \(indexPath.row)"
        let key = String(format: "ip:(%u,%u)", indexPath.section, indexPath.row)
        if !allHeight.keys.contains(key) {
            let value = cell.dynamicHeight
            allHeight[key] = value
        }
        return cell
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        
        debugPrint("heightForRowAt")
        
        let key = String(format: "ip:(%u,%u)", indexPath.section, indexPath.row)
        guard let height = allHeight[key] else { return 0 }
        return height
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.beginUpdates()
        let key = String(format: "ip:(%u,%u)", indexPath.section, indexPath.row)
        allHeight[key] = 200
        tableView.endUpdates()
    }
}
  • cell
import UIKit

class TestTableViewCell: UITableViewCell {
    
    public var content: String? {
        didSet {
            dynamicHeight = 100
            self.textLabel?.text = content
        }
    }
    
    private (set) public var dynamicHeight: CGFloat = 0
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淘衙,一起剝皮案震驚了整個濱河市传藏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖毯侦,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哭靖,死亡現(xiàn)場離奇詭異,居然都是意外死亡侈离,警方通過查閱死者的電腦和手機试幽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卦碾,“玉大人铺坞,你說我怎么就攤上這事≈夼郑” “怎么了济榨?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長绿映。 經(jīng)常有香客問我擒滑,道長,這世上最難降的妖魔是什么叉弦? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任橘忱,我火速辦了婚禮,結(jié)果婚禮上卸奉,老公的妹妹穿的比我還像新娘。我一直安慰自己颖御,他們只是感情好榄棵,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著潘拱,像睡著了一般疹鳄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芦岂,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天瘪弓,我揣著相機與錄音,去河邊找鬼禽最。 笑死腺怯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的川无。 我是一名探鬼主播呛占,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼懦趋!你這毒婦竟也來了晾虑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帜篇,沒想到半個月后糙捺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡笙隙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年洪灯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逃沿。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡婴渡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凯亮,到底是詐尸還是另有隱情边臼,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布假消,位于F島的核電站柠并,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏富拗。R本人自食惡果不足惜臼予,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啃沪。 院中可真熱鬧粘拾,春花似錦、人聲如沸创千。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽追驴。三九已至械哟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間殿雪,已是汗流浹背暇咆。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留丙曙,地道東北人爸业。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像河泳,于是被迫代替她去往敵國和親沃呢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容