需求:UITableView 始終垂直居中於父視圖,隨行數變化自動調整。每次 reloadData 後根據 contentSize.height 計算新 frame。
- (void)reloadAndCenterTableView {
[self.tableView reloadData];
// 強制佈局更新以獲取準確 contentSize
[self.tableView layoutIfNeeded];
CGFloat tableViewHeight = self.tableView.contentSize.height;
CGFloat parentHeight = self.view.bounds.size.height;
CGFloat y = (parentHeight - tableViewHeight) / 2.0;
y = MAX(y, 0); // 防止負值
CGRect frame = self.tableView.frame;
frame.origin.y = y;
frame.size.height = tableViewHeight; // 高度緊湊內容
self.tableView.frame = frame;
}
[self reloadAndCenterTableView];viewDidLayoutSubviews 中調用,需防止無限循環(加標誌位)。// 設置 tableView 垂直居中約束
[tableView.centerYAnchor constraintEqualToAnchor:view.centerYAnchor].active = YES;
// 高度由內容決定
tableView.estimatedRowHeight = 44;
tableView.rowHeight = UITableViewAutomaticDimension;
// 禁止滾動
tableView.scrollEnabled = NO;
Frame 計算靈活直觀,Auto Layout 更聲明式,按項目風格選擇。