2017-04-11 2 views
2

横のスタックビューに2つのラベルがあります。ラベルはnumberOfLinesが0に設定されているため、無限に折り返されます。垂直コンテンツ圧縮抵抗は1000に設定されているため、常にフルハイトになります。水平圧縮抵抗は250に設定されています。コンテンツハギングが設定されます。 〜1000(両方の軸、私はいつもフレームにラベルを抱かせたいからです)。参照:自己サイジングセルに比例配分されたUIStackView

Interface Builder screenshot

そして、そのスタックビューは、自己サイジングセル内の唯一の項目です。これは、上端、下端、前端、後端に制限されています。スタックビューには、ラベルと同じ圧縮抵抗/コンテンツの抱き合わせがあります。

実行時に、cellForRowAt indexPath関数で、2つのラベルをさまざまな長さのテキストに設定します。私はレイアウトが問題となる可能性があること他の場所で読んだので、私もやる:私が実行したときに

cell.contentView.setNeedsLayout() 
    cell.contentView.layoutIfNeeded() 

しかし、私は最初にいくつかの奇妙な行動を参照してください。しかし、私が周りをスクロールすると、物事は大丈夫に見えるようになります。問題は細胞の再利用と関係しているようですが、何が間違っているのか分かりません。初期ロード - 左側に

Simulator Screen Shots

。値ラベルは完全に切断されており、2番目のセルでは、比例スペーシングはまったく機能していないようです。値ラベルは名前ラベルと比較すると非常に狭いです。

テーブルの一番上にスクロールして一番上に戻ったところで、これはまさに私が期待していることです。ラベルは、その本質的なコンテンツサイズに基づいて比例して配置されます。しかし、どうやってスクロールしなくてもこの動作を得ることができますか?

+0

ラベルの幅をどのように計算すると思いますか?上の例では、右のラベルは非常に狭い(単語「いいえ」の幅)ため...下の例では、右のラベルは50%より広いです... – DonMag

+0

@DonMag - Appleのスタックビューのドキュメンテーション、fillProportionallyの配布プロパティを選択すると、ビューはスタックビューの軸に沿った固有のコンテンツサイズに基づいて比例してサイズ変更されます。 私は、ラベルの本質的なコンテンツサイズに基づいて幅を計算することを期待しています。これは、セルが再利用されたときに正常に動作するように見えますが、初めてセルがロードされたときには動作しません。 –

+0

確かに...、本質的な内容のサイズは何ですか?単一ラベルの場合、デフォルトフォント17、 "Fruitcake"テキストの*本来の内容サイズ*はそれ自体では '528 x 20.5'です...ラベルの制約を設定するか、または幅の制約があるスタックビューに埋め込むことで幅を制限すると、必要に応じて複数の行に折り返され、* intrinsic height *が変更されます... 2つのラベルがある場合、どれが本質的な高さですか? – DonMag

答えて

0

私はあなたの最大の問題は水平のStackViewであると信じています、あなたの幅はスタックされたコンテンツに基づいて動的に計算されます。 StackViewを幅の制約に基づいて特定の幅に制限した場合、より大きな仕事はコンテンツの幅を計算する方法になります。次に、無限の線を投げ込んでいるため、ある程度のスレッショルドがなければならないため、動的な幅がさらに難しくなります。

FieldNameまたはFieldValueに定義された幅を持つことをお勧めします。定数または相対幅は、親の幅のパーセンテージに基づいて設定することをお勧めします。 FieldNameがFieldValueよりも長くなることがあり、時にはそれが逆であることがあるので、あなたの抱擁と圧縮はちょうど互いに戦うことになるでしょう。

ハードリミットはどこかに設定する必要があります。

+0

不愉快なことは、細胞の再利用で大きな効果があるということです。問題は、セルがストーリーボードから最初にロードされたときにのみ発生します。それが最初にロードされたら、適切な幅を計算するために何らかの種類のアンダーザフードの魔法がなければならない。私はAppleにTSIを提出してUIKitのエンジニアにこれについてコメントするかもしれません。 –

+0

正直言ってアップルの問題はないと思う。私はそれがAPIの仕組みを理解することだと思います。私があなたに伝えたいことは、あなたが今述べたことは、一度最初に読み込まれると「正しい幅」がないということです。最初の計算と表示のみがあり、ここから何かがセルを正確に描画し、カスタム幅に対して不均一であることを伝える必要があります。あなたが「偉大な」作品を言っているのは、デバイスの種類のせいで純粋な状況の問題です。 – kruskop

+0

できるだけ明示的にしようとしている:私は、両方のラベルが無限に動く能力があるという事実のために、コンテンツの幅の1つに対して「ハード」制限を設定するよう指示しています。あなたは存在しない魔法を期待しているので問題があります。 – kruskop

関連する問題