これはポートレートです:
これは風景です
私はこれをローテーションで試しましたが成功しませんでした:
self.tableView.autoresizesSubviews = YES;
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
これはポートレートです:
これは風景です
私はこれをローテーションで試しましたが成功しませんでした:
self.tableView.autoresizesSubviews = YES;
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
私は最近この問題に遭遇しました。私の場合、アプリケーションウィンドウのルートコントローラーではないナビゲーションコントローラーの回転を実行していたためです。したがって、ナビゲーションコントローラーのレイアウトを変更するために、回転通知リスナー/アフィン変換/境界調整アプローチを使用していました。これは問題なく機能しましたが、ここで説明する結果が得られました。横向きに回転すると、ナビゲーションバーの高さが正しくサイズ変更されていないことに気付くのに少し時間がかかりました(つまり、横向きモードではフレームワークの高さが44から32ピクセルに減少しました)。私のアプリのルートビューコントローラーは、willRotateToInterfaceOrientationとdidRotateFromInterfaceOrientationに応答していました、 でも。そのビューコントローラーは、関連するナビゲーションコントローラーについてもすでに知っていました。willRotateToInterfaceOrientationメソッドに次のコードを追加することで問題を解決しました。
CGRect frame = self.navViewController.navigationBar.frame;
if (toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
frame.size.height = 44;
} else {
frame.size.height = 32;
}
self.navViewController.navigationBar.frame = frame;
これにより、同様の状況で誰かが時間を節約できることを願っています。
他のビューコントローラー自体を管理するカスタムビューコントローラーをルートとして使用する場合、すべてのローテーションイベントを現在アクティブなサブコントローラーに転送する必要があります(そのように呼ぶ場合もあります)。これらのイベントは次のとおりです。
– willRotateToInterfaceOrientation:duration:
– willAnimateRotationToInterfaceOrientation:duration:
– didRotateFromInterfaceOrientation:
– willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:
– didAnimateFirstHalfOfRotationToInterfaceOrientation:
– willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:
したがって、カスタムルートコントローラーによって管理されるナビゲーションコントローラーの場合、ナビゲーションコントローラーに転送– willAnimateRotationToInterfaceOrientation:duration:
すると、回転時のナビゲーションバーの高さが正しくないという問題が修正されます。
didRotateFromInterfaceOrientationメソッドに次の行を追加します。
[self.navigationController.view layoutSubviews];
私はこれがうまくいくことを願っています。
私はまったく同じ問題を抱えており、@jstevencoは私を本当に奇妙な解決策に導きました。私のビューも回転時に自動サイズ変更されますが、テーブルビューはそこにナビゲーションコントローラーがあることを理解していないようです。
tableviewcontroller内に、以下を追加します。
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
[super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
CGRect frame = navBar.frame;
if (fromInterfaceOrientation == UIInterfaceOrientationPortrait || fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
frame.size.height = 31.9;
} else {
frame.size.height = 44.1;
}
navBar.frame = frame;
}
31.9と44.1は非常に重要です。これらを32と44のままにしておくと、サイズ変更を行う必要がないため、無視されているようです。私のために働いた、それが他の誰かを助けることを願っています。
向きを変えた後、テーブルビューが少し下にスクロールしているように見えます。
呼び出しscrollToRowAtIndexPath:atScrollPosition:animated:
て一番上の行にスクロールしてみましたか?
この問題は、ナビゲーションコントローラーで「willAnimateRotationToInterfaceOrientation:」を呼び出したが、メソッド内からsuperを呼び出すのを忘れた場合に発生する可能性があります。
次のようなものが必要です。
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation];
// Your code here
}
このような状況で注意すべきことの1つは、ステータスバーを手動で変更する場合のステータスバーの向きです。ステータスバーが非表示になっておらず、ステータスバーの向きが間違っているときにビューのフレームを変更すると(コードでは、フレーム変更の直後にステータスバーの向きを更新している可能性があります)、自動的に表示されます。自動サイズ変更をオンにしていない場合でも、ナビゲーションバーのサイズを誤って変更します。
UINavigationController
デバイスの向きが変わったときに通知を受け取る必要があります。view
のUINavigationController
を別のに追加するだけの場合、これは発生しませんUIView
。
iOS 5以降でaddChildViewController:
は、親UIViewController
を呼び出すだけで、向きの変更がこの子ビューコントローラーに確実に伝達されます。