UITableView首次加载时XIB单元格高度异常,滚动后恢复
Hey there, let's dig into this UITableView cell height issue you're dealing with. The root problem here is that when the table first loads, your TagView hasn't finished laying out its content yet—so AutoLayout can't calculate the correct cell height. By the time you scroll back, the TagView has fully rendered, which is why the height fixes itself. Let's walk through the fixes step by step:
First, Fix the Static Height Constraint
Looking at your setSelected method, you're hardcoding heightTagViewConstraint.constant = 35—this is forcing the TagView to stay at 35pt tall regardless of its content. When you scroll, the layout system probably overrides this, but it's breaking the initial calculation. Remove that line entirely, and let the TagView's content determine its height.
Avoid Manual Frame Modifications
In setupLanguageCell, you're manually adjusting the levelTagView frame with levelTagView.frame = CGRect(...). Manual frame changes conflict with AutoLayout and throw off the layout system's ability to calculate intrinsic content size. Instead, use AutoLayout constraints to position the level tag relative to the language tag. For example:
// Replace manual frame setup with these constraints levelTagView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ levelTagView.centerYAnchor.constraint(equalTo: languageTagView.centerYAnchor, constant: 2), levelTagView.leadingAnchor.constraint(equalTo: languageTagView.trailingAnchor, constant: 8) ])
Force Layout Update After Configuring the Cell
After setting up all tags in your configureView method, you need to make sure the TagView finishes laying out before the table calculates the cell height. Add these lines at the end of configureView:
// Force TagView to layout its content tagView.setNeedsLayout() tagView.layoutIfNeeded() // Update the height constraint to match the TagView's actual content height self.heightTagViewConstraint.constant = tagView.intrinsicContentSize.height // Tell the cell to update its layout self.setNeedsLayout() self.layoutIfNeeded()
Double-Check TableView Configuration
Even though you mentioned setting the estimated row height, confirm these are set correctly in your view controller:
override func viewDidLoad() { super.viewDidLoad() tableView.rowHeight = UITableView.automaticDimension // Use a realistic estimated height (not too small, e.g., 100 instead of 44) tableView.estimatedRowHeight = 100 }
Bonus: Override Cell's Size Calculation
If the above steps still don't fix it, override systemLayoutSizeFitting in your TagViewCell to ensure it returns the correct height:
override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize { tagView.layoutIfNeeded() return super.systemLayoutSizeFitting(targetSize, withHorizontalFittingPriority: horizontalFittingPriority, verticalFittingPriority: verticalFittingPriority) }
These changes should ensure the table calculates the correct cell height on first load, since we're forcing the TagView to fully render its content before height calculation happens.
内容的提问来源于stack exchange,提问作者TechChain

