13

私が実行している更新されていません。特にテーブルをスクロールしてビューを再利用すると、高さが適切に計算されません。ときにはUILabelが折り返されることがあります。時には切り捨てられることもあります.1つ以上のラベルが表示されないことがあります。また、ラベル間に余分な間隔があることもあります。カスタムビューには、3つのUILabelを含む垂直UIStackViewが含まれます。そのうち1つがラップされます。のUITableViewのセクションヘッダーの自動身長はラップUILabel(<em>numberOfLines = 0</em>)を含有して自動/ダイナミックのUITableViewのセクションヘッダビューの問題に適切に

問題を示す完全なサンプルアプリは、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

答えて

1

で一般

UITableViewAutomaticDimensionを使用しているときは常に

viewForHeaderInSection 

前に呼び出さ

heightForHeaderInSection 

、sectionheaderの高さのみを計算します一度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 
} 

を、私は最近、この種の問題に直面している機能

+0

これは仮想化と絡み合っていません。セルはデキューされ、発生するたびにリサイズする必要があります。そうでなければ、仮想化は壊れています。 – Tim

1

にセクションインデックスを渡します。

あなたはにfuncを設定を変更することができます。

私はラベルに値を設定する前に、複数行のラベルのpreferredMaxLayoutWidth、すなわち

を設定することで、それを解決し、として彼らのpreferredMaxLayoutWidthを設定:ちょうどestimatedHeightForHeaderInSection機能を追加し、推定高さを返し

self.label1.preferredMaxLayoutWidth = self.label1.frame.size.width 
self.label2.preferredMaxLayoutWidth = self.label2.frame.size.width 
self.label3.preferredMaxLayoutWidth = self.label3.frame.size.width 
+0

私はこれを試して、行動の変化を見ていない。問題はまだサンプルアプリケーションにあります。 – outerstorm

2

。あなたの問題を解決します。変更したプロジェクトは、self.label1.preferredMaxLayoutWidth = self.label1.frame.size.width self.label1.numberoflines = 0; self.label1.linebreakmode = NSLineBreakByWordWrapping; awakeFromNibメソッド で または を追加回避策は、配列のヘッダビューを保持して、推定高度法

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 
} 
+0

私はこれの有無にかかわらず行動の変化は見られませんでした。 – outerstorm

+0

10.3.2では私にとっては何の問題もなく問題なく動作しているようです。あなたのiosバージョンは何ですか? –

+0

また、10.3.2。私は、サンプルアプリケーションからの動作のスクリーンショットで質問を更新しました。また、サンプルアプリケーションはgithub上で推奨された修正で更新されました。 – outerstorm

1

からダウンロードこれを一度チェックしてください。https://github.com/krishnasolankiD/multiLineLabel

+0

これはうまくいくかもしれませんが、仮想化をやめます。テーブルビューを使用する理由の50%に似ています! – Tim

0

からビューの高さを返すことができますhere

func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat 
{ 
    return 30; 
} 
関連する問題