5

さまざまな静的テキスト要素を表示する iOS ビューを作成しています。xib は次のようになります。

ここに画像の説明を入力

タイトル、タイムスタンプ、本文、フッターの 4 つのラベルを使用します。すべてのビューは、その上の兄弟ビューに垂直に固定され、親ビューの左/右に固定されます。すべてのラベルは、高さが >= で、行数が 0 に設定され、行の折り返しスタイルが「ワード ラップ」である本文を除いて、高さが固定されています。親ビューは UIScrollView です。

iPhone では問題ないように見えます。

iPhone スクロール開始 iPhone スクロールの終わり

ただし、iPad では次のように表示されます。

iPadのスクロール開始 iPadのスクロールの終わり

は?body ラベルの余分な縦方向のスペースはどこから来ているのでしょうか? xib とそのビュー コントローラーは、iPhone と iPad で同じです (現時点ではカスタム iPad コードはありません)。垂直方向のスペースは、ラベルがレンダリングする改行の数に直接関係していることがわかりました。行が折り返されない場合、余分な垂直方向のスペースはありません。折り返す行が数行だけの場合は、垂直方向に少し余分なスペースがあります。ほぼすべての行が折り返されている場合は、そのように見えます。

まず、UILabel がこのように動作する理由についてのアイデアはありますか?

第二に、これをやめることができない場合、どうすれば回避できますか?

私はすでにいくつかのことを試しました。-viewDidLayoutSubViews 内で [bodyLabel sizeToFit] を呼び出すと、ラベルは修正されますが、兄弟ビューのレイアウトは修正されません (たとえば、フッター ラベルが画面のすぐ下にプルアップされるのではなく、画面の下部に固定されます)。体)。sizeToFit を呼び出した後、ビュー全体をその子を再レイアウトしようとする試みは無視されます。また、フォントに基づいて高さを計算して UILabel のサイズを変更しようとしましたが、これは -sizeToFit と同じ動作になります (コードは増えますが)。

Body UILabel を UITextView に置き換えても、奇妙な垂直方向の間隔の問題は発生しませんが、UITextView の高さを手動で (フォント計算を使用して) 計算する必要があります。スクロールを拒否します (コンテンツが境界に対して大きすぎることを知らないかのように)。

だから現時点で私は立ち往生しています。UILabel が iPad レイアウトでこのように動作する理由の説明だけでも役立ちます。

4

2 に答える 2

3

主な問題は、Label 内のテキストの自動サイズ変更の方法が失敗することです。これは、iPad では、Label に最初から幅が設定されておらず、実行時に計算され、それが混乱の原因であるためです。iPhone では、ラベルの幅が設定されているため (IB では)、問題はありません。

問題を解決するには、次の 2 つの方法があります。

  1. 2 つの絵コンテを持つ : iPhone 用と iPad 用

    これを行うと、ラベルは最初から幅を認識し、iPhone と同じように機能します。 ここに画像の説明を入力

  2. iPhone と iPad の両方でストーリーボードを 1 つだけ持つ

    テキストに最適なサイズを計算し、その結果を使用してコードで高さの制約をラベルに追加することで、問題を回避できます。desiredSize を計算するには、次の式で幅を計算できますCurrent View's width - (Leading space + Trailing Space)。これが私のコードです

CGSize desiredSize = [_bodyLabel sizeThatFits:CGSizeMake(self.view.frame.size.width-40, 10)];
NSString *visualContraint = [NSString stringWithFormat:@"V:[_bodyLabel(%.0f)]",desiredSize.height];
[_bodyLabel addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:visualContraint
                                                                   options:NSLayoutFormatDirectionLeadingToTrailing
                                                                   metrics:nil
                                                                     views:NSDictionaryOfVariableBindings(_bodyLabel)]];

ここに画像の説明を入力

于 2013-09-05T07:57:46.737 に答える