ラップする(numberOfLines = 0)というUILabelを含む自動/動的UITableViewセクションヘッダービューで問題が発生しています。特にテーブルをスクロールしてビューが再利用されると、高さが正しく計算されません。 UILabelが折り返されたり、切り捨てられたり、1つ以上のラベルが表示されなかったり、ラベル間に余分なスペースができたりすることがあります。カスタムビューには、3つのUILabelを持つ垂直UIStackViewが含まれており、そのうちの1つが折り返されます。
この問題を示す完全なサンプルアプリは https://github.com/outerstorm/tableviewHeaderTest にあります。
セクションヘッダーの高さは、viewDidLoadで次のように自動に設定されます。
tableView.sectionHeaderHeight = UITableViewAutomaticDimension
tableView.estimatedSectionHeaderHeight = 30.0
また、機能させるために、次のheightForHeaderInSectionも実装しています。
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return UITableViewAutomaticDimension
}
setNeedsLayout()とlayoutIfNeeded()をさまざまに呼び出してみました役に立たないことを指します。任意の提案をいただければ幸いです。
以下は、アプリで見られる動作のスクリーンショットです。最初のセクションはカットオフで、2番目のセクションは高すぎます。
最近このような問題に直面しています。
マルチラインラベルのpreferredMaxLayoutWidth
を設定することで解決しました。
ラベルに値を設定する前に、preferredMaxLayoutWidth
を次のように設定します。
self.label1.preferredMaxLayoutWidth = self.label1.frame.size.width
self.label2.preferredMaxLayoutWidth = self.label2.frame.size.width
self.label3.preferredMaxLayoutWidth = self.label3.frame.size.width
estimatedHeightForHeaderInSection
関数を追加して、推定の高さを返します。それはあなたの問題を解決します。変更したプロジェクトを こちら からダウンロードします
func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat
{
return 30;
}
コードのドキュメントから:
// tableView:titleForHeaderInSection: or tableView:titleForFooterInSection: if the title is not nil.
言い換えると。 UITableViewAutomaticDimension
は、titleForHeaderInSection
またはtitleForFooterInSection
を使用してセクションタイトルを提供する場合にのみ使用することを目的としています
回避策は、ヘッダービューを配列で保持し、推定された高さメソッドからビューの高さを返すことです。
for _ in 0 ..< data.count {
let view = tableView.dequeueReusableHeaderFooterView(withIdentifier: "CustomHeaderView") as! CustomHeaderView
view.setup()
headerViews.append(view)
}
func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat
{
let view = headerViews[section] as? UIView
return (view?.frame.size.height)!
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
return headerViews[section] as? UIView
}
一般に
heightForHeaderInSection
いつも前に呼ばれる
viewForHeaderInSection
uITableViewAutomaticDimensionを使用する場合、tableview.reloadData()を手動で呼び出さない限り、セクションヘッダーの高さは一度だけ計算されます。
コードでは、セクションヘッダーのテキストを毎回変更します。高さは最初に計算されたもので、自動的に変更されることはありません。
セットアップ機能を次のように変更できます。
func setup(someNum: Int) {
let text = String(repeating: "This is where the really long text goes so that it will wrap lines appropriately", count: someNum)
mainLabel.text = text
}
そしてセクションインデックスを関数に渡します
追加
self.label1.preferredMaxLayoutWidth = self.label1.frame.size.width
self.label1.numberoflines = 0;
self.label1.linebreakmode = NSLineBreakByWordWrapping;
awakeFromNib
メソッドまたは 親切にこれを1回確認してください