shouldAutorotateToInterfaceOrientation не работает

Я писал свое универсальное приложение в портретном режиме, и теперь, после примерно 15-ти nib-файлов, многих многих viewCotnrollers, я хотел бы реализовать mustAutorotateToInterfaceOrientation и создать несколько экранов в ландшафтном режиме.

добавление:

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

на ВСЕ мои viewControllers, не делает работу.

Во время отладки я вижу, что этот метод вызывается, но он просто не будет работать! не в симуляторе, не в устройстве, не в Iphone, не в Ipad!

Я искал несколько ответов на форуме и видел некоторые советы по использованию:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 return (interfaceOrientation == UIInterfaceOrientationPortrait ||
   interfaceOrientation == UIInterfaceOrientationLandscapeLeft || 
   interfaceOrientation == UIInterfaceOrientationLandscapeRight ||
   interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown );
} 

Тоже не сработало,

добавив:

 [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

а также

 [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];

к моим viewDidLoad и viewDidUnload соответственно тоже не работали.

Я потерян.. Любая помощь подойдет!

просто еще одна информация... все мои виды имеют тип UIControl, так как мне нужен TuchUpInside для работы.

Оцените вашу помощь.

5 ответов

Решение

Убедитесь, что все ваши родительские представления имеют autoresizesSubviews = YES. Возможно, вам придется сделать это в коде, если вы не установили пружины и распорки в IB для всех своих представлений.

Цитирование руководства пользователя Interface Builder:

Важное замечание: Если в файле Nib Какао не заданы пружины или распорки для представления в Интерфейсном Разработчике, но затем используется метод setAutoresizingMask: для добавления поведения автоматического изменения размера во время выполнения, ваше представление может по-прежнему не отображать правильное поведение автоматического изменения размера. Причина в том, что Interface Builder полностью отключает автоматическое изменение размера дочерних элементов родительского представления, если для этих дочерних элементов не установлены пружины и распорки. Чтобы снова включить режим автоматического изменения размера, вы должны передать YES методу setAutoresizesSubviews: родительского представления. После этого дочерние представления должны правильно изменить размер.

Еще пара вещей, о которых нужно знать:

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

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    UIInterfaceOrientation des=self.interfaceOrientation;

    if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad) //iPad
    {
        if(des==UIInterfaceOrientationPortrait||des==UIInterfaceOrientationPortraitUpsideDown)//ipad-portairait
        {

        }
        else//ipad -landscape
        {

        }
    }
    else//iphone
    {
        UIInterfaceOrientation des=self.interfaceOrientation;

        if(des==UIInterfaceOrientationPortrait||des==UIInterfaceOrientationPortraitUpsideDown) //iphone portrait
        {

        }
        else //iphone -landscape
        {

        }
    }
return YES;
}

Для какой iOS вы строите? Это было объявлено устаревшим в iOS 6.0. (Вместо этого вы должны переопределить методы selectedInterfaceOrientations и предпочитаемый метод InterfaceOrientationForPresentation.)

Также вы можете вызвать shouldAutorotate в классе UIViewController:

https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html


Убедитесь, что вы проверили Поддерживаемые ориентации интерфейса на вкладке "Summery" в настройках проекта (выберите имя проекта в "Навигаторе проектов" в самом верху).

Если вы не выбрали ориентацию, которую хотите использовать, симулятор / iphone не позволит экрану изменить ориентацию.

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

У меня была эта проблема, но она работала в iOS6, но не в iOS5. Оказывается, у меня в раскадровке было представление, что я еще не создал класс viewcontroller.

Другие вопросы по тегам