2

UIScrollView を持つ ViewController があります。この VC では、スクロール ビュー内にある UILabel のフレームをプログラムで調整します。これは、viewDidLoad で行われます。この UILabel は、VC の xib ファイルから取得されます。プログラムで作成されたものではなく、フレームのみが変更されています。

この VC から別の VC に移行してから戻ると、UILabel のフレームが XIB の状態にリセットされます。テキストはリセットされませんが、以前に設定したテキストのままです。

UILabel のプロパティは willLayoutSubviews で正しく、VC に戻るときに didLayoutSubviews でリセットされるため、調査の結果、これは layoutSubviews で発生することがわかりました。

これは予想される動作ですか?ラベルのテキストが残っているのにフレームがリセットされる理由はありますか? これは、スクロールするたびに UIScrollView がその親ビューで layoutSubviews を呼び出すためですか?

ありがとう

4

1 に答える 1

2

あなたの説明には2つの問題があります。最初に、あなたはこれを言いました:

このVCでは、スクロールビュー内にあるUILabelのフレームをプログラムで調整します。これはviewDidLoadで行われます。

viewDidLoadシステムのレイアウトフェーズ(layoutSubviewsメッセージの送信中)がまだ行われていないため、でビューフレームを変更することは一般的に悪い考えです。ではviewDidLoad、ビューのフレームは現在のデバイスの画面サイズとインターフェイスの向きに合わせて調整されていません。

次に、自動レイアウトを使用しているとのことです。自動レイアウトシステムは、レイアウトフェーズ中にビューのフレームを設定します。レイアウトフェーズは、(あなたが発見したように)ビューの出現と消失を含む多くの異なるイベントによってトリガーされる可能性があります。

ラベルのフレームの「スティック」を調整するには、ラベルのフレームを制御する制約を変更する必要があります。これを行う1つの方法は、変更する必要のある制約ごとにView Controllerにタイプのアウトレットを作成し、NSLayoutConstraintこれらのアウトレットをxibの制約に接続することです。次に、View Controllerで、必要に応じて各制約viewWillLayoutSubviewsのプロパティを変更できます。constant(皮肉なことに、constantはの唯一の変更可能なプロパティですNSLayoutConstraint。)

于 2013-02-26T21:10:17.983 に答える