2017-06-30 3 views
0

UITableView私はセルの高さが自動レイアウトに基づいて自動です。私がサブビューを追加するまでは、レンダリングされたセルの最終的な幅に基づいてカスタムの方法で高さが変わります。実際の幅に基づいてUITableViewCellサブビューの制約を更新するタイミングと場所

要するに、私はカスタム数のビューを表示する必要があり、可視の数はセルの幅に依存し、ビューの数も高さに影響します。

問題は現在、問題のサブビューでlayoutSubviewsで計算と表示操作を行っていますが、これはテーブルビューのセルの高さが大きく外れることにつながります。だから私は計算を行う必要があると信じて&ビューを追加/削除するので、autolayoutは正確なテーブルビューのセルの高さを計算できますが、実際には正確な幅でセルを計算します。

さまざまな場所で強制的にsetNeedsLayoutおよびlayoutIfNeededがこの問題を解決していません。

興味深いことに、これは、高さをスクロールして自分自身を修正し、最終的にはすべてのセルが正しい高さになる状況の1つです。それは物事は​​非常にオフであることをテーブルビューの最初の負荷にあるようだ。

+0

ビューの数は高さにどのように影響しますか?たぶんワイドディスプレイで1列の表示を、狭いディスプレイで2行を表示していますか? – DonMag

+0

しかし、セルの幅はUITableViewでは変更されません。あなたは、レイアウトを固定した2つのセル(および2つの再利用識別子)を使用する方が良いでしょう。その後、ロジックを 'cellForRow'メソッドに移動し、正しいセルタイプをデキューします。 – Fogmeister

+0

@DonMag私は、セルの幅に完全に収まる一連のサムネイルを表示しています。固定されたアスペクト比が与えられていると、視認可能なビューの数はその行の高さに影響します。 – Sencha

答えて

0

私はlayoutSubviews()に私の細胞内のサブビューの高さ制約を変更し、viewDidLoad()の終わりにこれを置くことは私のテストではうまく動作しているようだ:あなたのデザインが許すならば、

tableView.setNeedsLayout() 
    tableView.layoutIfNeeded() 
    tableView.reloadData() 

別のオプション、とそのセルの高さを再カルクためにテーブルを伝えるために、次のようになります。

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    tableView.beginUpdates() 
    tableView.endUpdates() 
} 

はあなたの「デフォルト」をと仮定すると、サムネイルの一つ「行」で、あなたはあなたのテーブルの行が2行目を明らかに拡大表示されます。

または、あなたがアニメーション表示したくない場合は:

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    UIView.setAnimationsEnabled(false) 
    tableView.beginUpdates() 
    tableView.endUpdates() 
    UIView.setAnimationsEnabled(true) 
} 

をしかし、あなたの実際のグラフィックやデザインに応じて、あなたはそのアプローチを取っちらつきが表示される場合があります。

関連する問題