Запуск в портретную ориентацию с главного экрана iPhone 6 Plus в альбомной ориентации приводит к неправильной ориентации



фактическое название для этого вопроса длиннее, чем я могу поместиться:



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



короче говоря, это выглядит так это:





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





воспроизведение:




  1. iPhone 6 Plus работает под управлением iOS 8.0.


  2. приложение, чей plist поддерживает все-но-портрет-вверх ногами ориентации.


  3. корневой контроллер представления приложения является UITabBarController.


  4. все, панель вкладок контроллер и все его дочерние контроллеры представления возвращают UIInterfaceOrientationMaskPortrait с supportedInterfaceOrientations.


  5. начните с главного экрана iOS.


  6. поворот в альбомную ориентацию (требуется iPhone 6 Plus).


  7. холод-запустите приложение.


  8. результат: сломанные ориентации интерфейса.



Я не могу придумать никакого другого способа обеспечить портретную ориентацию за исключением to полностью отключить ландшафт, что я не могу сделать: наши контроллеры модального вида веб-браузера нуждаются в ландшафте.



Я даже попробовал подкласс UITabBarController и переопределение supportedInterfaceOrientations для возврата маски только для портрета, но это (даже со всеми другими шагами выше) не исправило проблему.





вот ссылка на пример проекта, показывая ошибку.




539   13  

13 ответов:

У меня была такая же проблема при запуске нашего приложения в ландшафте на iPhone 6 плюс.

наше исправление состояло в том, чтобы удалить ландшафтные поддерживаемые ориентации интерфейса из plist через настройки проекта:

Removed landscape orientation

и реализовать приложение: 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];


это исправило проблему.

просто удалите все элементы в поддерживаемой ориентации интерфейса, кроме того, что вы хотите (мне нужен только портрет) в информации.плист, это будет работать для меняenter image description here

Я получил ту же ошибку на моем приложении, я понял это с этим решение

во-первых, это не сработало, но после некоторых раскопок я должен сделать это на начальном контроллере после заставки.

ответ-это язык OjbC позвольте мне обновить его до Swift

override var shouldAutorotate: Bool {
    return true
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

Не забывайте, что должно быть на начальном контроллере вида.

просто позвони [приложение setStatusBarOrientation:uiinterfaceorientationportrait анимированный: нет]; в методе делегата приложения - (BOOL)применение: (UIApplication *)применение didFinishLaunchingWithOptions: (NSDictionary *)launchOptions

на самом деле устройство теперь является UIInterfaceOrientationPortrait после запуска ,если вы касаетесь inputField, клавиатура портретная раскладка

Comments

    Ничего не найдено.