Портретные и альбомные виды сосуществуют в одном приложении iOS - PullRequest
0 голосов
/ 28 марта 2019

У меня есть UITabBarController, управляющий несколькими UIViewControllers

, которые отображают разные UIViews.

ВСЕ, НО ОДИН из видов должен отображаться ТОЛЬКО В РЕЖИМЕ ПОРТРЕТА, без возможности поворота, в то время как ТОЛЬКО ОДИН ВИД должен отображаться ТОЛЬКО в РЕЖИМЕ ЛАНДШАФТА, без возможности поворота.

Это кажется тривиальным, но я не могу этого достичь ... Либо все виды в портретном режиме, либо все в горизонтальном режиме. Они либо все вращаются, либо ни один из них не делает.

Ниже приведен код для альбомного представления, но компилятор полностью игнорирует инструкции, и представление поворачивается в портретный режим при повороте устройства.

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation  
{
     return UIInterfaceOrientationLandscapeRight;  
}

-(BOOL) shouldAutorotate 
{
     return NO; 
}

Единственный способ остановить автоповорот - установить флажок в Device Orientation в IB, но затем настройка применяется ко ВСЕМ видам, и ни один из них не поворачивается.

Я читал, что в последнее время больше нельзя применять индивидуальные настройки к каждому представлению, что кажется абсурдным.

Есть ли обходной путь?

Отредактировано с дополнительной информацией: @ManWithBeard, я не могу понять, как адаптировать ваш код к моему .. Мой UITabBarController управляет различными UIViewController, определенными в их заголовках следующим образом:

@interface Portrait_ViewController : UIViewController
@interface LandscapeViewController : UIViewController

AppDelegate обращается к первому контроллеру вида с

[self.tabBarController setSelectedViewController: Portrait_ViewController]

и затем из любого ViewContoller я перехожу к нужному с помощью

[self.tabBarController setSelectedIndex:index]

Я не понимаю, как применить UITabBarController к UIViewControllers с @interface ChildOrientationTabBarController : UITabBarController, как вы предложили.

Ответы [ 2 ]

0 голосов
/ 30 марта 2019

Я читал, что в последнее время больше нельзя применять индивидуальные настройки для каждого вида, что кажется абсурдным.

Это не абсурд, и это так. Нельзя заставить разные дочерние элементы контроллера представления вкладок принимать разные принудительные ориентации.

Единственный способ форсировать ориентацию, отличную от текущей, - через представленный контроллер вида.

0 голосов
/ 28 марта 2019

Приложение запрашивает только верхний контроллер для ориентации интерфейса.

В вашем случае UITabBarController является верхним контроллером, а другие контроллеры являются его потомками.

Вам необходимо создать собственный подкласс UITabBarController, переопределить этот метод и вместо этого передать значения из текущего выбранного контроллера.

Пример таких контейнеров:
Swift

class ChildOrientationTabBarController: UITabBarController {
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return selectedViewController?.supportedInterfaceOrientations ?? .portrait
    }
    override var shouldAutorotate: Bool {
        return selectedViewController?.shouldAutorotate ?? false
    }
}
class ChildOrientationNavigationController: UINavigationController {
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return topViewController?.supportedInterfaceOrientations ?? .portrait
    }
    override var shouldAutorotate: Bool {
        return topViewController?.shouldAutorotate ?? false
    }
}

Objective-C

@interface ChildOrientationTabBarController : UITabBarController
@end
@implementation ChildOrientationTabBarController

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return [self.selectedViewController supportedInterfaceOrientations] ?: UIInterfaceOrientationMaskPortrait;
}

- (BOOL)shouldAutorotate {
    return [self.selectedViewController shouldAutorotate] ?: NO;
}
@end

@interface ChildOrientationNavigationController : UINavigationController
@end
@implementation ChildOrientationNavigationController

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return [self.topViewController supportedInterfaceOrientations] ?: UIInterfaceOrientationMaskPortrait;
}

- (BOOL)shouldAutorotate {
    return [self.topViewController shouldAutorotate] ?: NO;
}
@end

И AppDelegate должен переопределить supportedInterfaceOrientation метод как:
Swift

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return window?.rootViewController.supportedInterfaceOrientations ?? .portrait
}

Objective-C

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    return [[window rootViewController] supportedInterfaceOrientations] ?: UIInterfaceOrientationMaskPortrait;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...