Обработка вращения в iOS6

Я хочу поддерживать только одну ориентацию в одном представлении в моем стеке UINavigationController. Как я могу это сделать?

Это также должно работать в iOS5.I '

Ответы на вопрос(3)

Решение Вопроса

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

Создайте категорию UINavigationController и назовите ее "UINavigationController + АВТОПЫ».

Поместите это в свой UINavigationController + autoRotate.h:

#import 

@interface UINavigationController (autoRotate)

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation;
-(BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;

@end

Поместите это в UINavigationController + autoRotate.m:

#import "UINavigationController+autoRotate.h"

@implementation UINavigationController (autoRotate)

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return [self.topViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

- (BOOL)shouldAutorotate
{
    return [self.visibleViewController shouldAutorotate];
}


- (NSUInteger)supportedInterfaceOrientations
{
    if (![[self.viewControllers lastObject] isKindOfClass:NSClassFromString(@"ViewController")])
    {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
    else
    {
        return [self.topViewController supportedInterfaceOrientations];
    }
}

@end

Для видов, которые вы не хотите вращать, добавьте:

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

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

- (BOOL)shouldAutorotate
{
    return NO;
}

А для Views вы хотите повернуть:

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

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAllButUpsideDown;
}

- (BOOL)shouldAutorotate
{
    return YES;
}

В вашем приложенииs делегат, добавьте:

- (NSUInteger)application:(UIApplication*)application supportedInterfaceOrientationsForWindow:(UIWindow*)window
{
    return UIInterfaceOrientationMaskAllButUpsideDown;
}
 mmackh11 дек. 2012 г., 09:16
@HotLicks Чтобы обеспечить совместимость с iOS5, но спасибо - должен был быть опечаткаAutorotate
 Fahim Parkar14 янв. 2014 г., 07:56
это работает гладко ... :)
 RdPC21 июн. 2013 г., 16:57
Действительно полезный пример! В записке яДобавлю, что он также работает с UITabBarController, если кто-то другой ищет решение.
 Hot Licks10 дек. 2012 г., 21:43
Зачем реализовыватьshouldAutorotateToInterfaceOrientation: когда это'является устаревшим методом? И является "shouldAutoRotate» пишется таким образом (с заглавной буквы R) в вашей фактической реализации?
 AppAspect01 апр. 2013 г., 17:07
Действительно полезно. Это помогло мне, сэкономило мое время и сделало в очень короткие сроки.
 Hot Licks11 дек. 2012 г., 13:09
FWIW, реализация defaultInterfaceOrientations по умолчанию возвращает 26 - все ориентации, кроме перевернутой. Таким образом, нет необходимости добавлять метод в VC, для которых этого значения по умолчанию достаточно.
 Raz03 апр. 2013 г., 00:10
@ mmackh, что тыТо, что вы делаете выше, не является подклассом, вместо этого вы создаете категорию. Что ты'Работа над этим - плохая практика программирования. Причина, по которой переопределение этих методов в категории является плохой / плохой идеей, заключается в том, что выОбойти все, что UINavigationController делает внутри этих методов, и передать их реализацию вашему собственному классу. Отменяя тебяЯ никогда не смогу получить доступ к оригинальной реализации, выполненной UINavigationController. Подклассами вы можете вызвать [super someMethod]. Вы можете'сделать это в категории.
 Hot Licks11 дек. 2012 г., 13:04
Да, но тыдобавляем mustAutorotateTo ... в контроллер nav и просматриваем его в стеке. Для iOS5 с этим добавленным кодом будет считаться вершина стека. Это кажется ненужным (и излишне запутанным).

Я рекомендую вам НЕ создавать категорию на UINavigationController для переопределения этих методов. Категории не предназначены для этого, и нет никакой гарантии, что ваш код будет загружен вместо Apple 'Один (даже если на самом деле это работает). Я советую вам создать подкласс UINavigationController и переопределить эти методы в нем.

 mmackh02 нояб. 2012 г., 08:28
Из примечаний к выпуску бета-версии 6.1: Приложения только для альбомной ориентации, которые вызывают контроллер портретного представления (например, экран входа в Game Center), вызовут сбой приложения. Обходной путь: Приложения должны предоставить приложение метода делегата: supportInterfaceOrientationsForWindow: и убедиться, что портрет является одним из возвращаемых значений маски. Когда задействован UINavigationController, создайте подкласс UINavigationController и переопределите supportInterfaceOrientations.

Решение не работает на iOS 6 (хорошо на iOS 5), когда:

vc A поддерживает только портретную ориентациюvc B поддерживает все ориентациимы толкаемvc B отvc Aповернутьvc B (например, в ландшафте) и вернуться к.vc Avc A ориентация остается в ландшафтном режиме ...
 nicolas05 нояб. 2012 г., 14:51
Хорошо, я попробовал еще раз и ... я нашел свою ошибку, вsupportedInterfaceOrientations, Я делалreturn [self.visibleViewController supportedInterfaceOrientations] вместоreturn [self.topViewController supportedInterfaceOrientations, Теперь это работает как шарм. Спасибо!!!
 mmackh02 нояб. 2012 г., 08:31
Кажется, работает для меня на iPhone 5 & 4 с iOS 6 и 5
 mmackh05 нояб. 2012 г., 16:02
Рад слышать, пожалуйстане забудьте оценить вопрос & ответь если тыЯ нашел это полезным.

Ваш ответ на вопрос