swift5.x tableViewCell自適應(yīng)高度及高度緩存(systemLayoutSizeFitting)

先說(shuō)一下存在的問(wèn)題:昨天晚上處理一個(gè)相對(duì)比較復(fù)雜的自適應(yīng)cell讹俊,想緩存獲取的高度不對(duì)牵啦。這里貼一下圖迫皱。這里這是展示布局上很少的一部分。有時(shí)間再研究一下


IMG_0012.PNG

下面說(shuō)一下正常情況了昙沦。也可能是上面的布局太復(fù)雜琢唾,哪里出了問(wèn)題。先展示一下獲取正常高度的圖


IMG_0013.PNG

1盾饮、先看cell里面的代碼采桃;最主要的是看約束,相對(duì)cell的top bottom(whiteView),以及whiteView的子視圖相對(duì)于whiteView的約束

lazy var whiteView:UIView = {
        let view = UIView()
        view.backgroundColor = .white
        view.layer.cornerRadius = 5
        view.layer.shadowColor = UIColor.init(hex: "0x3B6FF5").cgColor
        view.layer.shadowOffset = CGSize(width: 0, height: 0)
        view.layer.shadowRadius = 5
        view.layer.shadowOpacity = 0.8
        return view
    }()
    
    lazy var titleLabel: UILabel = {
        let view = UILabel()
        view.text = "描述標(biāo)題描述標(biāo)題描述標(biāo)題描述標(biāo)題描述標(biāo)題描述標(biāo)題描述標(biāo)題描述標(biāo)題描述標(biāo)題描述標(biāo)題描述標(biāo)題描述標(biāo)題描述標(biāo)題描述標(biāo)題描述標(biāo)題描述標(biāo)題"
        view.numberOfLines = 0
        view.font = .systemFont(ofSize: 14)
        view.sizeToFit()
        return view
    }()
    
    lazy var picImageView: UIImageView = {
        let view = UIImageView()
        view.image = UIImage.image(image: UIImage.init(named: "001")!, orientation: .up)
        return view
    }()
    
    lazy var commentView:ALFitHeightView = {
        let view = ALFitHeightView()
        return view
    }()
    
    func al_makeUI(){
        self.contentView.addSubview(self.whiteView)
        self.whiteView.addSubview(self.titleLabel)
        self.whiteView.addSubview(self.picImageView)
        self.whiteView.addSubview(self.commentView)
        self.titleLabel.snp.makeConstraints { (make) in
            make.leading.top.equalToSuperview().offset(15)
            make.right.equalToSuperview().offset(-15)
        }
        self.picImageView.snp.makeConstraints { (make) in
            make.leading.equalTo(self.titleLabel)
            make.right.equalTo(self.titleLabel)
//          make.center.equalToSuperview()
            make.top.equalTo(self.titleLabel.snp.bottom).offset(5)
        }
        self.commentView.snp.makeConstraints { (make) in
            make.top.equalTo(self.picImageView.snp.bottom).offset(5)
            make.left.equalTo(self.titleLabel.snp.left)
            make.right.equalTo(self.titleLabel.snp.right)
            make.bottom.equalToSuperview().offset(-15)
        }
        self.whiteView.snp.makeConstraints { (make) in
            make.top.left.equalToSuperview().offset(10)
            make.bottom.right.equalToSuperview().offset(-10)
        }
    }
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.selectionStyle = .none
        al_makeUI()
    }

2丘损、看控制器里面的代碼

var heightArr:NSMutableArray = {
        let arr = NSMutableArray()
        
        return arr
    }()
    
    lazy var tableView: UITableView = {
        let view = UITableView.init(frame: CGRect(x: 0, y: CGFloat(NavigationHeight), width: self.view.frame.size.width, height: self.view.frame.size.height - CGFloat(NavigationHeight)), style: .plain)
        view.delegate = self
        view.dataSource = self
        view.separatorStyle = .none
        view.register(ALFitHeightTableViewCell.self, forCellReuseIdentifier: "cell")
        view.tableFooterView = UIView.init(frame: CGRect.zero)
        view.backgroundColor = UIColor.init(hex: "FAFBFF")
        if #available(iOS 11, *){
            view.contentInsetAdjustmentBehavior = .never
        }else{
            if #available(iOS 13.0, *) {
                view.automaticallyAdjustsScrollIndicatorInsets = false
            } else {
                self.automaticallyAdjustsScrollViewInsets = false
            }
        }
        return view
        
    }()
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 30
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if self.heightArr.count > 0 {
            let height = self.heightArr[safe:indexPath.row]
            if height != nil {
                DebugLog("1111")
                return height as! CGFloat
            }
            return UITableView.automaticDimension
//          return height != nil ? height as! CGFloat : UITableView.automaticDimension
        }else{
            return UITableView.automaticDimension
        }
    }
    
    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return 100
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ALFitHeightTableViewCell
        
        return cell
    }
    
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        let height = self.heightArr[safe:indexPath.row]
        if height == nil{
            let height = cell.systemLayoutSizeFitting(CGSize(width: self.tableView.width(), height: 0), withHorizontalFittingPriority: .required, verticalFittingPriority: .fittingSizeLevel).height
            self.heightArr.add(height)
            DebugLog(height)
        }
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
    }
    
    
    override func viewDidLoad() {
        super.viewDidLoad()

            self.navTitle = "tableviewcell高度自適應(yīng)"
            self.view.addSubview(self.tableView)
    }

補(bǔ)充:經(jīng)一朋友提醒芍碧,試了一下 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 在這個(gè)方法里面可以直接拿到cell.frame,可以不用再調(diào)用系統(tǒng)的systemLayoutSizeFitting方法再計(jì)算一遍消耗CPU資源

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末号俐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子定庵,更是在濱河造成了極大的恐慌吏饿,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔬浙,死亡現(xiàn)場(chǎng)離奇詭異猪落,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)畴博,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)笨忌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人俱病,你說(shuō)我怎么就攤上這事官疲。” “怎么了亮隙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵途凫,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我溢吻,道長(zhǎng)维费,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任促王,我火速辦了婚禮犀盟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蝇狼。我一直安慰自己阅畴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布题翰。 她就那樣靜靜地躺著恶阴,像睡著了一般诈胜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冯事,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天焦匈,我揣著相機(jī)與錄音,去河邊找鬼昵仅。 笑死缓熟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摔笤。 我是一名探鬼主播够滑,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吕世!你這毒婦竟也來(lái)了彰触?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤命辖,失蹤者是張志新(化名)和其女友劉穎况毅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體尔艇,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尔许,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了终娃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片味廊。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖棠耕,靈堂內(nèi)的尸體忽然破棺而出余佛,到底是詐尸還是另有隱情,我是刑警寧澤窍荧,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布衙熔,位于F島的核電站,受9級(jí)特大地震影響搅荞,放射性物質(zhì)發(fā)生泄漏红氯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一咕痛、第九天 我趴在偏房一處隱蔽的房頂上張望痢甘。 院中可真熱鬧,春花似錦茉贡、人聲如沸塞栅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)放椰。三九已至作烟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砾医,已是汗流浹背拿撩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留如蚜,地道東北人压恒。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像错邦,于是被迫代替她去往敵國(guó)和親探赫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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