首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS UITableView 動態調整 Header View 高度:從 400 變 800 的正確姿勢

     編輯:程式設計綜合問答

需求場景

UITableView 的 `tableHeaderView` 初始高度 400pt,點擊 Header 內按鈕後需展開至 800pt,並伴隨動畫效果。

核心方案:重新賦值 tableHeaderView + 動畫

直接修改 `headerView.frame.size.height` 無效,必須重新設置 `tableView.tableHeaderView` 觸發佈局刷新。

代碼實現(Swift)

@objc func expandHeader() {
    let header = tableView.tableHeaderView!
    var frame = header.frame
    frame.size.height = 800
    header.frame = frame
    
    // 關鍵:重新賦值觸發佈局
    UIView.animate(withDuration: 0.3) {
        self.tableView.tableHeaderView = header
        self.tableView.layoutIfNeeded()
    }
}

關鍵點解析

  • 重新賦值:`tableView.tableHeaderView = header` 會讓 tableView 重新計算 header 佈局
  • Auto Layout 兼容:若 header 內部用 Auto Layout,需先 `header.layoutIfNeeded()` 再取 `systemLayoutSizeFitting` 獲取目標高度
  • 不需 reloadData:僅調整 header 高度不涉及 cell 數據變化,調用 `reloadData` 反而會閃爍

進階:支援折疊/展開切換

var isExpanded = false
@objc func toggleHeader() {
    isExpanded.toggle()
    let targetHeight = isExpanded ? 800 : 400
    var frame = tableView.tableHeaderView!.frame
    frame.size.height = targetHeight
    tableView.tableHeaderView!.frame = frame
    
    UIView.animate(withDuration: 0.3) {
        self.tableView.tableHeaderView = self.tableView.tableHeaderView
        self.tableView.layoutIfNeeded()
    }
}

避坑指南

  1. 不要在 `heightForHeaderInSection` 處理 tableHeaderView(那是 section header)
  2. 2. 若 header 含圖片/文字自適應,先 `systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)` 獲取實際高度 3. iOS 15+ 若用 `sectionHeaderTopPadding` 需額外處理間距

總結

動態調整 `tableHeaderView` 高度的核心是修改 frame 後重新賦值給 tableView.tableHeaderView 並配合動畫,而非調用 `reloadData`。掌握此技巧可實現平滑的展開/折疊效果。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved