Подтвердить что ты не робот

Авторизовать один UIViewController в iOS 6 с UITabBar

У меня есть приложение, которое работает только в Portrait Mode, но есть singleView, который может отображать видео, поэтому я хочу, чтобы этот просмотр работал и в landscape mode, но в iOS 6 я не могу понять, как я может это сделать, теперь у меня есть это:

В AppDelegate.m у меня есть:

self.window.rootViewController = myTabBar;

то в Сводке проекта:

enter image description here

и я обнаружил, что в iOS 6 для обнаружения вращения просмотра я должен сделать это:

- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}

// Tell the system It should autorotate
- (BOOL) shouldAutorotate {
return YES;
}

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

4b9b3361

Ответ 1

Во-первых, ваши целевые настройки должны выглядеть так: Supported Interface Orientations

В UITabBarController:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // You do not need this method if you are not supporting earlier iOS Versions
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

-(NSUInteger)supportedInterfaceOrientations
{
    if (self.selectedViewController) 
        return [self.selectedViewController supportedInterfaceOrientations];

    return UIInterfaceOrientationMaskPortrait;
}

-(BOOL)shouldAutorotate
{
    return YES;
}

Внутри ViewController:

a) если вы не хотите вращать:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (BOOL)shouldAutorotate
{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

b), если вы хотите повернуть на пейзаж:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAllButUpsideDown;
}

Edit:

Другое решение - реализовать этот метод внутри AppDelegate:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    NSUInteger orientations = UIInterfaceOrientationMaskAll;

    if (self.window.rootViewController) {
        UIViewController* presented = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
        orientations = [presented supportedInterfaceOrientations];
    }
    return orientations; 
}

Ответ 2

Я бы написал комментарий, но не могу, поэтому я отправляю это как ответ.

Это был мой сценарий:

Мое приложение поддерживает изменение ориентации только на определенные виды, и я не мог понять, как это сделать только для тех, которые я хотел, затем я приземлился на этот вопрос и увидел ответ mientus (спасибо за это), тогда я пошел дальше и сделал то, что он предложил, который был подклассом UITabBarController, и переопределить эти методы:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{

    NSLog(@"AUTO ROTATE IN CUSTOM TAB BAR");
    // You do not need this method if you are not supporting earlier iOS Versions
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}


-(NSUInteger)supportedInterfaceOrientations{

    NSLog(@"supportedInterfaceOrientations IN CUSTOM TAB BAR");

    if (self.selectedViewController)
        return [self.selectedViewController supportedInterfaceOrientations];

    return UIInterfaceOrientationMaskPortrait;
}

-(BOOL)shouldAutorotate{

    NSLog(@"shouldAutorotate IN CUSTOM TAB BAR");
    return [self.selectedViewController shouldAutorotate];
}

то внутри каждого контроллера представления у меня будут методы, чтобы указать, нужно ли мне вращение или нет. Методы в UITabBarController вызывались, но не те, что были в моем контроллере view, поэтому ротация все еще происходила там, где я этого не хотел. Затем я подклассифицирую UINavigationController и переопределяю те же методы только с этим изменением на поддерживаемомInterfaceOrientation, чтобы выглядеть следующим образом:

- (NSUInteger)supportedInterfaceOrientations{

NSLog(@"supportedInterfaceOrientations IN CUSTOM NAV BAR CALLING CURRENT VIEW CONTROLLER");
UIViewController* presented = [[self viewControllers] lastObject];
return [presented supportedInterfaceOrientations];

}

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

Ответ 3

Является ли представление, которое вы хотите повернуть подвью только для портрета? Обычно просмотр поведения вращения наследуется от rootviewcontroller. Затем, если вы вернете NO в shouldAutorotate в rootviewcontroller, вы остановите вращение в каждом отдельном недосмотре.

Я предлагаю разделить вашу архитектуру следующим образом:

rootViewController → supportedInterfaceOrientations = Portrait и shouldAutorotate = YES NORotationViewControllers → supportedInterfaceOrientations = Portrait и shouldAutorotate = YES rotationViewControllers → supportedInterfaceOrientations = All и shouldAutorotate = YES

Если вы еще не прочитали это, посмотрите: Поддержка ориентации нескольких интерфейсов