Запуск в портретную ориентацию с главного экрана iPhone 6 Plus в альбомной ориентации приводит к неправильной ориентации
фактическое название для этого вопроса длиннее, чем я могу поместиться:
запуск приложения, корневой контроллер вида которого поддерживает только портретную ориентацию, но который в противном случае поддерживает альбомную ориентацию на iPhone 6 Plus, когда главный экран находится в альбомной ориентации, приводит к состоянию неопределенности, когда окно приложения находится в альбомной ориентации, но устройство находится в портретной ориентации.
короче говоря, это выглядит так это:

когда это должно выглядеть так:

воспроизведение:
iPhone 6 Plus работает под управлением iOS 8.0.
приложение, чей plist поддерживает все-но-портрет-вверх ногами ориентации.
корневой контроллер представления приложения является UITabBarController.
все, панель вкладок контроллер и все его дочерние контроллеры представления возвращают
UIInterfaceOrientationMaskPortraitсsupportedInterfaceOrientations.начните с главного экрана iOS.
поворот в альбомную ориентацию (требуется iPhone 6 Plus).
холод-запустите приложение.
результат: сломанные ориентации интерфейса.
Я не могу придумать никакого другого способа обеспечить портретную ориентацию за исключением to полностью отключить ландшафт, что я не могу сделать: наши контроллеры модального вида веб-браузера нуждаются в ландшафте.
Я даже попробовал подкласс UITabBarController и переопределение supportedInterfaceOrientations для возврата маски только для портрета, но это (даже со всеми другими шагами выше) не исправило проблему.
вот ссылка на пример проекта, показывая ошибку.
13 ответов:
У меня была такая же проблема при запуске нашего приложения в ландшафте на iPhone 6 плюс.
наше исправление состояло в том, чтобы удалить ландшафтные поддерживаемые ориентации интерфейса из plist через настройки проекта:
и реализовать приложение: supportedInterfaceOrientationsForwindow: в делегате приложения:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { return UIInterfaceOrientationMaskAllButUpsideDown; }по-видимому, информация в вашем plist-это указать, какие ориентации вашего приложения разрешено запускать.
задание
statusBarOrientationнаUIApplicationКажется, работает для меня. Я поместил его вapplication:didFinishLaunchingWithOptions:метод в приложении делегата.- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { application.statusBarOrientation = UIInterfaceOrientationPortrait; // the rest of the method }
это похоже на ошибку в iOS 8 при использовании UITabBarController в качестве контроллера корневого представления. Обходной путь заключается в использовании в основном ванильного UIViewController в качестве контроллера корневого представления. Этот контроллер вида vanilla будет служить в качестве родительского контроллера вида вашего контроллера панели вкладок:
///------------------------ /// Portrait-Only Container ///------------------------ @interface PortraitOnlyContainerViewController : UIViewController @end @implementation PortraitOnlyContainerViewController - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } @end // Elsewhere, in app did finish launching ... PortraitOnlyContainerViewController *container = nil; container = [[PortraitOnlyContainerViewController alloc] initWithNibName:nil bundle:nil]; [container addChildViewController:self.tabBarController]; self.tabBarController.view.frame = container.view.bounds; [container.view addSubview:self.tabBarController.view]; [self.tabBarController didMoveToParentViewController:container]; [self.window setRootViewController:container];
у меня была очень похожая проблема. Я хотел заставить портретный режим везде, кроме воспроизведения видео.
что я сделал:
1) чтобы заставить ориентацию приложения быть в портрете в AppDelegate:
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { if ([window.rootViewController.presentedViewController isKindOfClass:[MPMoviePlayerViewController class]]) { return UIInterfaceOrientationMaskAll; } return UIInterfaceOrientationMaskPortrait; }2) запуск пустого контроллера модального вида исправил проблему в моем случае. Я запускаю его в viewDidLoad первого контроллера вида, который находится в корне моего NavigationViewController (первый контроллер вида, видимый после запуск приложения):
- (void)showAndHideNamelessViewControllerToFixOrientation { UIViewController* viewController = [[UIViewController alloc] init]; [self presentViewController:viewController animated:NO completion:nil]; [viewController dismissViewControllerAnimated:NO completion:nil]; }
пожалуйста, попробуйте следующий код. Вероятно, эта проблема вызвана размером ключевого окна при ландшафтном запуске.
// in application:didFinishLaunchingWithOptions: ... self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; [self.window setFrame:[[UIScreen mainScreen] bounds]]; //<- ADD!!
не повезло мне обходной путь Джареда с помощью универсального контроллера представления контейнера. Я уже подкласс tab bar controller с supportedInterfaceOrientations без везения, а также. Независимо от ориентации 6+ после запуска окно панели вкладок сообщает
frame = (0 0; 736 414)пока единственный обходной путь, который я нашел, - это заставить оконную раму после makeKeyAndVisible
[self.window makeKeyAndVisible]; self.window.frame = CGRectMake(0, 0, MIN(CGRectGetWidth(self.window.frame), CGRectGetHeight(self.window.frame)), MAX(CGRectGetWidth(self.window.frame), CGRectGetHeight(self.window.frame)));
Я хочу, чтобы мое приложение открывалось только в ландшафтном режиме (и не демонстрировало проблему, описанную выше на iPhone 6 Plus), поэтому я установил
Landscape (left home button)иLandscape (right home button)как единственные ориентации, разрешенные в файле PLIST моего приложения. Это устраняет проблему ориентации при открытии моего приложения. Однако мне нужно, чтобы мое приложение поддерживало портретный режим только для одного вида, так как я показываюUIImagePickerControllerв моем приложении, которое Apple требует показывать в портретном режиме на iPhone.я смог поддержать портрет для этого одного вида только, сохраняя открытие моего приложения в ландшафтном режиме, включив следующий код в
AppDelegate:-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { return UIInterfaceOrientationMaskAllButUpsideDown; } else { return UIInterfaceOrientationMaskAll; } }
для себя, у меня была та же проблема, что и jaredsinclair, но подкласс a
UIViewControllerсsupportedInterfaceOrientationsметод не решал проблему. Вместо этого я сделал именно то, что он сделал в моемappDidFinishLaunchingметодAppDelegateиUITabBarControllerкак ребенок к нормальномуUIViewControllerа не его подкласс и это сработало!
Я в той же ситуации, и делаю [self.окна setFrame:...] не работает для меня.
добавление следующего в конце приложения: didFinishLaunchingWithOptions-это единственное, что я нашел, что работает. Это заставляет экран мигать и не совсем чистый и эффективный.
Я добавил Это в конце приложения: didFinishLaunchingWithOptions:
UIViewController *portraitViewController = [[UIViewController alloc] init]; UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:portraitViewController]; [self.navController presentViewController:nc animated:NO completion:nil]; [self.navController dismissViewControllerAnimated:NO completion:nil]; [UIViewController attemptRotationToDeviceOrientation];
У меня была аналогичная проблема с моим приложением работает как в альбомной и портретной ориентации с UITabBarController в качестве корневого контроллера вида.
всякий раз, когда приложение было запущено в ландшафтном режиме, представление было неверным.
все, что я должен был сделать: - удалите назначение контроллера rootview в XIB. - Вручную добавьте его после запуска приложения:
(void)applicationDidFinishLaunching: (UIApplication *)применение { приложение.statusBarHidden = YES;
[self.окно setRootViewController: self.tabBarController];
это исправило проблему.
Я получил ту же ошибку на моем приложении, я понял это с этим решение
во-первых, это не сработало, но после некоторых раскопок я должен сделать это на начальном контроллере после заставки.
ответ-это язык OjbC позвольте мне обновить его до Swift
override var shouldAutorotate: Bool { return true } override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .portrait }Не забывайте, что должно быть на начальном контроллере вида.
просто позвони [приложение setStatusBarOrientation:uiinterfaceorientationportrait анимированный: нет]; в методе делегата приложения - (BOOL)применение: (UIApplication *)применение didFinishLaunchingWithOptions: (NSDictionary *)launchOptions
на самом деле устройство теперь является UIInterfaceOrientationPortrait после запуска ,если вы касаетесь inputField, клавиатура портретная раскладка


Comments