48

デバイスが回転するときのレイアウトの制約を変更したい。MyUIViewControllerは 2UIViewsで構成され、横向きでは横方向に、縦向きでは縦方向に配置されます。

それは実際に機能しwillAnimateRotationToInterfaceOrientationます. では、必要な制約を削除し、それらを他のものに置き換えて適切なレイアウトにしました...

しかし、回転中に自動レイアウトが呼び出される前に制約を破り始めるという問題があるwillAnimateRotationToInterfaceOrientationため、デバイスの向きの変更が発生したときに制約をどこで置き換えるつもりですか?

別の問題はパフォーマンスです。数回回転させた後、システムは制約を破ることはありませんが、特に縦向きモードではパフォーマンスが大幅に低下します...

4

3 に答える 3

55

で、拘束を変更する必要がある任意のビューwillRotateToInterfaceOrientation:duration:に送信します。setNeedsUpdateConstraints

または、UIViewサブクラスを作成します。サブクラスで、 receive に登録しますUIApplicationWillChangeStatusBarOrientationNotification。通知を受け取ったら、自分自身に を送信しますsetNeedsUpdateConstraints

これneedsUpdateConstraintsにより、ビューにフラグが設定されます。layoutSubviewsシステムが (メッセージを送信して)レイアウトを実行する前に、フラグが設定されupdateConstraintsているすべてのビューにメッセージを送信します。needsUpdateConstraintsここで、制約を変更する必要があります。サブクラスUIViewを作成してオーバーライドupdateConstraintsし、制約を更新します。

于 2013-04-25T07:31:54.540 に答える
2

以下のコードのように制約を更新するには、オーバーライド-(void) viewWillLayoutSubviewsします。UIViewController

-(void) viewWillLayoutSubviews {
     switch(self.interfaceorientation)
     {
          case UIInterfaceOrientationLandscapeLeft:

              break;
          case UIInterfaceOrientationLandscapeRight:

              break;

          case UIDeviceOrientationPortrait:

              break;

          case UIDeviceOrientationPortraitUpsideDown:

              break;

     }
}
于 2013-02-06T08:12:55.090 に答える