6

iOS 6.0 の新しい autolayout API を使用して動的レイアウトを構築しようとしています。私が構築しようとしているレイアウトには、下の画像に示すように、間にラベルが付いた 2 つのボタンがあります。

ここに画像の説明を入力

私が望むのは、ラベル内のテキストの量に応じて、灰色で表示されるコンテナー ビューのサイズを増減することです。

これまでのところ、解決できなかった小さな問題が 1 つありますが、説明どおりにレイアウトを正確に機能させることができました。私が抱えている問題は、ラベルの固有の高さが、ラベルの元の幅 (たとえば、インターフェイス ビルダーで設定されたもの) で常に計算され、制約から設定されたラベルの幅ではないことです。

ビューに対する制約は次のとおりです。

  • H:|-[左ボタン]-[ラベル]-[右ボタン]-|
  • 両方のボタンが垂直方向に中央揃え
  • V: |-[ラベル]-|
  • ボタンのコンテンツの優先度がラベルよりも高い
  • ラベルの圧縮抵抗は、コンテナビューよりも高くなっています

これらの制約がすべて組み合わされて、目的のレイアウトが作成されます。

でも:

  • インターフェイス ビルダーのラベルの幅 (インターフェイス ビルダーのリテラル サイズ) が実行時のビューの幅よりも小さい場合、コンテナーの高さが大きすぎます。

ここに画像の説明を入力

これを明確にするために、上記のレイアウトの IB ビューは次のようになりました (はるかに狭いことに注意してください)。

ここに画像の説明を入力

  • インターフェイス ビルダーのラベルの幅 (インターフェイス ビルダーのリテラル サイズ) が実行時のビューの幅よりも大きい場合、コンテナーの高さが小さすぎて、テキストの行が途切れます。

発生しているように見えるのは、ラベルの幅に制約はありませんが、ラベルが作成されたときのラベルの元の幅に基づいて、ラベルの高さを計算しているように見えることです (したがって、自動レイアウトはコンテナーの高さを計算します)。ただし、非常に奇妙なのは、テキストの幅と高さが正しいように見えても、ラベル自体のフレームが大きすぎたり小さすぎたりすることです。

これは物事が起こっている順序に関連していると思います.containerViewsのlayoutSubviewメソッドでupdateConstraintsIfNeededを呼び出してみましたが、これは何もしていないようです.

どんな提案でも大歓迎です。

4

3 に答える 3

10

私は遅れているかもしれませんが、解決策を見つけた方法です。ラベルの幅が変更されるたびに、Label の preferredMaxLayoutWidth を手動で更新する必要があります。例えば:

Label.preferredMaxLayoutWidth = 200;

インターフェイス ビルダーは、preferredMaxLayoutWidth に初期ラベル幅を設定します。お役に立てれば。

于 2012-12-18T20:07:21.327 に答える
0

ラベルで -invalidateIntrinsicContentSize を呼び出してみましたか?

于 2012-09-26T09:48:04.770 に答える