2つの子ViewControllerを含むことができるカスタムViewControllerがあります。デバイスが縦向きの場合、コントローラーの1つのビューが表示されます。デバイスが横向きの場合、他のコントローラーのビューが表示されます。ただし、横向きのビューが表示されると、ステータスバーが縮小され、特定のビュー用のスペースが増えます。デバイスがポートレートモードに戻った後、ステータスバーは非表示になります。これはカスタムビューコントローラで、内に表示されますUINavigationController
。
私の問題は、ステータスバーの表示が変更されたときにサブビューが適切に調整されないことです。下の図のように、デバイスをさまざまな方向に向けると、大きなギャップやオーバーラップが発生します。
ご覧のとおり、最初は(縦向きで)問題ありませんが、デバイスを回転させると、ステータスバーがあった場所に白い隙間ができます。デバイスを縦向きに戻すと、UINavigationController
のナビゲーションバーが表示され、ステータスバーと重なって、ナビゲーションバーとその下のビューの間にギャップが表示されます。ある横向きから反対の横向きに180度回転するのが非常に速い場合、ギャップはなくなり、見栄えが良くなります。
以下のメソッドはカスタムViewControllerに属しており、willAnimateRotationToInterfaceOrientation:duration:
(明らかに回転イベントを処理するために)およびviewDidAppear:
(ナビゲーションスタック内の前のView Controllerからビューがプッシュされたときに処理するために)呼び出されます。
- (void)cueAnimationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation fromViewDidAppear:(BOOL) fromViewDidAppear
{
// Fading animation during orientation flip.
// Make sure its not already animating before trying.
BOOL barHidden = [UIApplication sharedApplication].statusBarHidden;
if (!isAnimating) {
BOOL alreadyGoodGrid = (UIInterfaceOrientationIsLandscape(interfaceOrientation) && curView == self.gridViewController.view);
BOOL alreadyGoodTable = (UIInterfaceOrientationIsPortrait(interfaceOrientation) && curView == self.tableViewController.view);
if ((alreadyGoodGrid && barHidden) ||
(alreadyGoodTable && !barHidden)) {
// If views are the way they should be for this orientation. Don't do
// anything.
return;
}
isAnimating = YES;
UIView *nextView;
// Get starting orientation. This will determine what view goes on top
if (UIInterfaceOrientationIsLandscape(interfaceOrientation))
nextView = self.gridViewController.view;
else
nextView = self.tableViewController.view;
if (nextView == self.tableViewController.view)
{
if (!alreadyGoodTable)
{
self.tableViewController.view.alpha = 0.0;
[self.view bringSubviewToFront:self.tableViewController.view];
}
// Unhide the bar for the table view
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];
}
else // gridViewController
{
if (!alreadyGoodGrid)
{
self.gridViewController.view.alpha = 0.0;
[self.view bringSubviewToFront:self.gridViewController.view];
}
// Hide the bar for the grid view
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
}
[UIView animateWithDuration:0.4
delay: 0.0
options: UIViewAnimationOptionAllowUserInteraction
animations:^{
if (nextView == self.tableViewController.view) {
self.tableViewController.view.alpha = 1.0;
}
else {
self.gridViewController.view.alpha = 1.0;
}
}
completion:^(BOOL finished) {
if (nextView == self.tableViewController.view) {
curView = self.tableViewController.view;
}
else {
curView = self.gridViewController.view;
}
isAnimating = NO;
}];
}
}
これを見るのに時間をかけることができる人に感謝します。