web-dev-qa-db-ja.com

UITableViewセクションヘッダーの自動高さが正しく更新されない

ラップする(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番目のセクションは高すぎます。

enter image description here

15
outerstorm

最近このような問題に直面しています。

マルチラインラベルの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
3
PGDev

estimatedHeightForHeaderInSection関数を追加して、推定の高さを返します。それはあなたの問題を解決します。変更したプロジェクトを こちら からダウンロードします

func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat 
{
    return 30;
}
2
Jaffer Sheriff

コードのドキュメントから:

// tableView:titleForHeaderInSection: or tableView:titleForFooterInSection: if the title is not nil.

言い換えると。 UITableViewAutomaticDimensionは、titleForHeaderInSectionまたはtitleForFooterInSectionを使用してセクションタイトルを提供する場合にのみ使用することを目的としています

1
Alex Chase

回避策は、ヘッダービューを配列で保持し、推定された高さメソッドからビューの高さを返すことです。

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
}
1
Anuj Panwar

一般に

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
}

そしてセクションインデックスを関数に渡します

1
weikel

追加

self.label1.preferredMaxLayoutWidth = self.label1.frame.size.width
self.label1.numberoflines = 0;
self.label1.linebreakmode = NSLineBreakByWordWrapping;

awakeFromNibメソッドまたは 親切にこれを1回確認してください

0
krishna solanki