Ответ 1
Пожалуйста, попробуйте следующий код
В didFinishLaunchingWithOptions
of AppDelegate
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
[self.window setFrame:[[UIScreen mainScreen] bounds]]; //Add
мое приложение до iOS 7 работает правильно. Я пробовал это сегодня с Xcode 6, и когда я запускаю его, у меня неприятный сюрприз: (:
Вы можете видеть, что Xcode теперь нарисовал мой viewController, как если бы он был в портретном режиме, но, как вы можете видеть, он находится в ландшафтном режиме.
Знаете ли вы, что изменилось в iOS 8?:/ Я использовал следующие методы ориентации:
ИЗМЕНИТЬ:
Я просто открываю этот метод:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskLandscape;
}
И теперь мои первые контроллеры view работают правильно:). проблема в том, когда я показываю модальный (который меняет набор методов в UIInterfaceOrientationMaskAll) переделывает уродливый эффект скриншота. Именно поэтому я меняю свои методы в этом режиме:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if(self.restrictRotation)
{
return UIInterfaceOrientationMaskLandscape;
}
else
{
return UIInterfaceOrientationMaskAll;
}
}
// THIS IS A DELEGATE OF MODAL VIEW CONTROLLER
- (void)updateInterfaceAfterDocumentPreviewViewController
{
NSLog(@"updateInterfaceAfterDocumentPreviewViewController");
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft];
AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
appDelegate.restrictRotation = YES;
}
Пожалуйста, попробуйте следующий код
В didFinishLaunchingWithOptions
of AppDelegate
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
[self.window setFrame:[[UIScreen mainScreen] bounds]]; //Add
Проблема заключается в порядке вызовов при настройке окна. Вам нужно позвонить makeKeyAndVisible
, прежде чем назначать rootViewController
в вашем методе didFinishLaunchingWithOptions
в делегате приложения. Следующие работы:
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self.window makeKeyAndVisible];
self.window.rootViewController = self.myMainViewController;
Но если вы измените порядок на:
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = self.myMainViewController;
[self.window makeKeyAndVisible];
Вы получаете поведение, которое вы испытываете.
У меня была такая же точная проблема с "экраном загрузки". Это то, что сработало для меня. (Обратите внимание: мое приложение поддерживает только iOS 7 или более поздней версии, ландшафтный режим.):
CGRect theFrame = self.view.frame;
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
CGRect screenBounds = [[UIScreen mainScreen] bounds];
theFrame.origin = CGPointZero;
theFrame.size.width = screenBounds.size.height;
theFrame.size.height = screenBounds.size.width;
}
NSLog(@"%@", [NSNumber valueWithCGRect:theFrame]);
self.loadingScreen = [[UIView alloc] initWithFrame:theFrame];
Пожалуйста, обратитесь к Майку Хэй, если ваше приложение поддерживает портретную ориентацию и "длинный путь для расчета правильной рамки приложения": fooobar.com/questions/239319/...
Надеюсь, что это поможет.
Посмотрите на свой файл .plist.
У меня была аналогичная проблема, я не мог получить правильные изображения запуска для показа (у меня было два для iPad, Default-Portrait.png и Default-Landscape.png), и я также не смог получить приложение для автоматической ориентации после исчезновения изображения запуска.
Чтобы решить проблему для изображений запуска:
Чтобы решить проблему ориентации приложения сначала ViewController:
Этот подход к обнаружению ориентации был устарел в iOS8 (но до сих пор разрешен). Он был заменен концепцией классов классов и Trait Collections.
(Как ни странно, я не могу найти ссылку на класс класса в онлайн-документах Apple прямо сейчас - поклялся, что это было раньше - возможно, в XCode). См. здесь для видео WWDC.
Во всяком случае, в Interface Builder установлен флажок "Использовать классы размеров." Возможно, у вас это проверено. Выключите его и посмотрите, помогает ли это?
Решение Oldschool:
BOOL portrait;
BOOL iOS8OrLater = ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0);
if (iOS8OrLater) {
CGFloat height = CGRectGetHeight(self.view.frame);
CGFloat width = CGRectGetWidth(self.view.frame);
if (width / height > 1.0) {
portrait = NO;
} else {
portrait = YES;
}
} else {
portrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);
}
if(portrait) {
[self layoutPortrait];
} else {
[self layoutLandscape];
}
Вы можете вызвать это в viewWillLayoutSubviews
UIInterfaceOrientation currentOrientation = [UIApplication sharedApplication].statusBarOrientation;
if( UIDeviceOrientationIsLandscape( currentOrientation ) )
{
if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
{
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
// -- Fix for rotation issue for ios 8
if( IS_IOS_8_OR_LATER )
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad"
bundle: nil];
// -- Set frame of nav controller
UINavigationController *nc = [storyboard instantiateViewControllerWithIdentifier:@"NavController"];
self.window.rootViewController = nc;
[self.window setFrame:[[UIScreen mainScreen] bounds]];
// -- Set fame of home view controller
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"Home"];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
[self.window setFrame:[[UIScreen mainScreen] bounds]];
}
}
}