Нужно ли приложению TabBar долженAutorotateToInterfaceOrientation возвращать YES на всех его viewControllers? - PullRequest
1 голос
/ 06 декабря 2011

Я работаю над приложением для iphone с TabBarController в качестве rootcontroller.И этот корневой контроллер связан с навигационными контроллерами (каждый из которых связан с определенной кнопкой панели вкладок).

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

- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)toInterfaceOrientation
{
    return YES;
}

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

Любая идея, какпросто оставить альбомную ориентацию только на этой фотографии и отключить ее на всех других видах?

Ответы [ 2 ]

3 голосов
/ 06 декабря 2011

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

Чтобы ответить на ваш вопрос вкратце:да, он должен возвращать YES, если вы хотите, чтобы любой из viewControllers с вкладками разрешил переориентацию.То же самое касается viewControllers в стеке вашего UINavigationControllers.Следовательно, то же самое касается любой их комбинации.

Из Технического примечания Apple по этому вопросу:

Почему мой UIViewController не вращается с устройством?

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

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

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

В реализации shouldAutorotateToInterfaceOrientation: toInterfaceOrientation всех ваших viewControllers, верните глобальное значение.Измените это глобальное значение в соответствии с потребностями отображаемого в данный момент viewController.Несмотря на то, что говорят, что viewController спрашивают только один раз, этот общий слух оказался неверным для меня.Итак, вот супер хак;

Все контроллеры представлений в вашем стеке навигации должны реализовывать метод shouldAutorotate следующим образом:

- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)toInterfaceOrientation
{
    extern BOOL gSouldAutorotateToAnyOrientationFlag;
    if (gShouldAutorotateToAnyOrientationFlag)
    {
        return YES;
    }
    return UIInterfaceOrientationIsPortrait(toInterfaceOrientation);   
}

Теперь где-то в вашем приложении вы должны объявить и создать экземплярэтот глобальный флаг - вы можете поместить этот уродливый глобальный флаг в реализацию вашего делегата приложения, прямо под импортом и над блоком @implementation:

BOOL gShouldAutorotateToAnyOrientationFlag = NO;

во всех viewControllers, которые должны отображаться в портретном режиметолько установите этот флаг в сторону NO - например, в пределах viewWillAppear;

- (void)viewWillAppear:(BOOL)animated
{
    extern BOOL gShouldAutorotateToAnyOrientationFlag;
    gShouldAutorotateToAnyOrientationFlag = NO;   
}

В пределах viewController / s, которые должны отображаться в любой ориентации, установите этот флаг в направлении YES - снова в пределах viewWillAppear;

- (void)viewWillAppear:(BOOL)animated
{
    extern BOOL gShouldAutorotateToAnyOrientationFlag;
    gShouldAutorotateToAnyOrientationFlag = YES;   
}

Таким образом, всякий раз, когда весь стек навигации запрашивает его возможности ориентации, будет дан правильный ответ.Исходя из моего опыта, снова и снова задается весь стек, а ответы не кэшируются, поэтому мой хак срабатывал всякий раз, когда мне это было нужно.Тем не менее, кажется, широко распространен слух, что эти ответы каким-то образом кешируются, и поэтому этот слух может быть действительным в определенных случаях - следовательно, я не буду нести ответственность, если это не сработает для вас (или даже будет отклонено: D)

0 голосов
/ 06 декабря 2011

В представлении вы хотите только пейзаж для:

- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)toInterfaceOrientation
{
    return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}

Вы можете заменить UIInterfaceOrientationIsLandscape на UIInterfaceOrientationIsPortrait, если это лучше соответствует вашим потребностям.

...