自動レイアウトがない場合は、これをコードで処理する必要があります。これを行うための推奨される方法は、コンテナビュー(ラベルとテキストファイルを含むビュー)をサブクラス化し、layoutSubviews
メソッドをオーバーライドすることです。そこで、必要な基準(ラベルテキストメトリックなど)に基づいて、ビューのサブビューのフレームを手動で設定します。
編集:これは、メソッドに含まれる可能性のあるものの特定の例ですcontainverView
layoutSubviews
(頭のてっぺんから入力):
// Those could be IBOutlets, or obtained by inspecting self.subviews
UILabel *label = self.label;
UITextField *textField = self.textField;
// Determine the labelSize, we could limit the maxSize (especially the height) manually here
CGSize maxSize = self.bounds.size;
CGSize labelSize = [label.text sizeWithFont:label.font constrainedToSize:maxSize lineBreakMode:label.lineBreakMode];
// Set the computed label size
CGRect labelFrame = label.frame;
labelFrame.size = labelSize;
label.frame = labelFrame;
// Now move the textField just below the label (we could also add a vertical margin here if we want)
CGRect textFieldFrame = textField.frame;
textFieldFrame.origin.y = labelFrame.origin.y + labelFrame.size.height;
textField.frame = textFieldFrame;
これにより、テキストフィールドが常にラベルの下にあることが確認されます。設定した制約によっては、UIが正しくレイアウトされるように、コードを追加する必要がある場合があります。
[containverView setNeedsLayout]
また、ラベルテキストが変更されたときにそれが呼び出されることを確認する必要があります。