Я столкнулся с аналогичной проблемой, которую решил с помощью категории на UINavigationController.
UINavigationController + LayoutCorrecting.h:
@interface UINavigationController (LayoutCorrecting)
- (void)recalculateNavigationBarFrameRelativeToStatusBar;
@end
UINavigationController + LayoutCorrecting.m:
#import "UINavigationBar+LayoutCorrecting.h"
#import "UIViewAdditions.h"
@implementation UINavigationController (LayoutCorrecting)
- (void)recalculateNavigationBarFrameRelativeToStatusBar {
CGRect sbf = [[UIApplication sharedApplication] statusBarFrame];
if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation))
self.navigationBar.top = sbf.size.width;
else
self.navigationBar.top = sbf.size.height;
}
@end
Если вы немного подправите эту категорию, объявив ее в UIViewController и убедившись, что она настраивает controller.view.frame, а не navigationBar.top, я думаю, вам будет хорошо. Просто не забудьте вызвать метод category на вашем контроллере представления после того, как ваш фильм завершит воспроизведение, и вы уже показали строку состояния.
И просто для того, чтобы избежать путаницы, вероятно, стоит упомянуть, что вам нужно использовать ширину строки состояния в ландшафтном режиме, потому что система координат UIWindow всегда работает так, как если бы она находилась в портретном режиме, несмотря на как вы держите устройство. Это в отличие от подпредставлений (экземпляров UIView), которые управляются UIViewController, которые получают выгоду от автоматических преобразований координат.
P.S .: Так как вам придется настраивать рамку вашего вида в контексте окна, эта функция также может помочь.
CGRect CGRectOffsetRectForOrientation(CGRect rect, CGFloat dx, CGFloat dy, UIInterfaceOrientation orientation) {
CGRect newRect = rect;
switch (orientation) {
case UIInterfaceOrientationPortrait:
newRect.origin.x += dx;
newRect.origin.y += dy;
break;
case UIInterfaceOrientationPortraitUpsideDown:
newRect.origin.x -= dx;
newRect.origin.y -= dy;
break;
case UIInterfaceOrientationLandscapeLeft:
newRect.origin.y -= dx;
newRect.origin.x += dy;
break;
case UIInterfaceOrientationLandscapeRight:
newRect.origin.y += dx;
newRect.origin.x -= dy;
break;
default:
break;
}
return newRect;
}