Как отключить альбомную ориентацию в одном представлении на iOS 7/8

Я включил альбомную ориентацию для своего приложения в общих целевых настройках: enabled альбомная ориентация

Все работает нормально - приложение доступно во всех выбранных ориентациях...

Теперь я хочу отключить ландшафтный режим только для одного представления.

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

- (BOOL)shouldAutorotate
{
    return NO;
}


- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

К сожалению, безуспешно...


Изменить:

Структура моего приложения:

UITabBarController
    UINavigationController
        UITableViewController
            UIViewController

person Laurenz Glück    schedule 14.03.2015    source источник
comment
Это представление встроено в навигационный контроллер?   -  person Josh Gafni    schedule 14.03.2015
comment
@JoshGafni Да, это дополнительный вид ...   -  person Laurenz Glück    schedule 14.03.2015


Ответы (1)


Вы поместили код выше в ViewController представления или NavigationController? Вам нужно поместить его в навигационный контроллер, иначе навигационный контроллер будет вращаться, что также приведет к вращению представления. Подкласс UINavigationController и переопределение shouldAutoRotate:

- (BOOL)shouldAutorotate
{
    id currentViewController = self.topViewController;

    if ([currentViewController isKindOfClass:[ViewController class]])
        return NO;

    return YES;
}

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

ИЗМЕНИТЬ

Внутри UITabBarController:

- (BOOL)shouldAutorotate
{

    if([self.selectedViewController isKindOfClass:[UINavigationController class]]){

        UINavigationController *navigationController = (UINavigationController *) self.selectedViewController;
        id currentViewController = navigationController.topViewController;

        if ([currentViewController isKindOfClass:[ViewController class]])
            return NO;
        }
    }
    return YES;
}
person Josh Gafni    schedule 14.03.2015
comment
Спасибо за быстрый ответ! Добавил ваш код в NavigationController - но ничего не произошло... Я добавил к вопросу свою структуру приложения - может в этом проблема? - person Laurenz Glück; 15.03.2015
comment
Я добавил точку останова в функцию shouldAutorotate, и она не вызывается, если я открываю табличное представление (на вкладке)... - person Laurenz Glück; 15.03.2015
comment
На самом деле держись. Что именно вы хотите, чтобы произошло. Вы хотите, чтобы вкладки вращались, а вид внутри — нет? Вы хотите, чтобы панель навигации также вращалась? - person Josh Gafni; 15.03.2015
comment
У меня есть разные вкладки, внутри них есть несколько табличных представлений, ниже табличных представлений находится обычный контроллер представления... Обычное приложение должно вращаться, но некоторые из дополнительных представлений ниже табличного представления не должны... - person Laurenz Glück; 15.03.2015
comment
но я предполагаю, что когда вы просматриваете контроллеры обычного вида, вкладки и панель навигации все еще видны на экране. Вы хотите, чтобы они также не вращались, если на экране находится контроллер нормального вида? - person Josh Gafni; 15.03.2015
comment
Если на экране находятся контроллеры обычного вида, приложение должно полностью вращаться (с вкладкой/панелью навигации...). Только если появляется конкретное подробное представление (панель вкладок теперь скрыта), приложение больше не должно вращаться... - person Laurenz Glück; 15.03.2015
comment
Если я установил shouldAutorotate {return NO} в UITabBarController, приложение больше не вращается... Есть ли способ проверить что-то вроде isKindOfClass...? Если вы понимаете, о чем я? - person Laurenz Glück; 15.03.2015
comment
См. ответ здесь: stackoverflow. ком/вопросы/4306704/. Подкласс UITabBarController и поместите переопределение shouldAutoRotate. Вам нужно получить отображаемый навигационный контроллер и проверить, является ли его topViewController детальным ViewController. Если это так, верните НЕТ. - person Josh Gafni; 15.03.2015
comment
UIViewController *currentVC = self.tabBarController.selectedViewController; в UITabBarController возвращает null внутри функции shouldAutorotate - знаете почему? - person Laurenz Glück; 15.03.2015
comment
почему вы ссылаетесь на self.tabBarController внутри UITabBarController? self - это UITabBarController... - person Josh Gafni; 15.03.2015
comment
Я добавил этот код в свой UITabBarController — не так ли? - person Laurenz Glück; 15.03.2015
comment
Если я регистрирую currentViewController, это все время null - если я проверяю self.selectedViewController, я получаю текущий UINavigationController - действительно странно... - person Laurenz Glück; 15.03.2015
comment
теперь я получаю сообщение об ошибке topViewController не найдено на selectedViewController ... :/ - person Laurenz Glück; 15.03.2015
comment
Давайте продолжим обсуждение в чате. - person Josh Gafni; 15.03.2015