UIViewController не вращается автоматически

Как сказано в названии. Мой UIViewController не будет вращаться ни на что. Когда он загружается, вызывается shouldAutorotateToInterfaceOrientation, но после этого он не работает.

ОБНОВЛЕНИЕ 1:

Это действительно очень странная проблема. По крайней мере для меня. И я постараюсь все объяснить.

Это приложение на основе навигации. Каждый контроллер имеет

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

Xcontroller является потомком Acontroller и не вращается автоматически. Если Xcontroller станет дочерним по отношению к Bcontroller, он будет автоматически поворачиваться. Значит, с Acontroller что-то не так. Но Acontroller идентичен (кроме своих данных) Bcontroller.

Что случилось?

ОБНОВЛЕНИЕ 2:

Решил воссоздать Acontroller. И это сработало. Кажется, я упустил какую-то глупость.


person looneygrc    schedule 10.03.2010    source источник
comment
Как вы реализовали -shouldAutorotateToInterfaceOrientation:?   -  person kennytm    schedule 10.03.2010
comment
- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {return YES; } Если вы это имеете в виду :).   -  person looneygrc    schedule 10.03.2010


Ответы (9)


Я не уверен, та же ли причина, что и в вашем случае. Но я испытал то же самое. shouldAutorotateToInterfaceOrientation вначале вызывали только один раз. После серьезной отладки путем разборки кода я обнаружил, что причина кроется в моем переопределенном методе инициализации. У меня было это раньше:

- (id)initWithAlbum:(PhotoAlbum *)theAlbum {
    if (self) {     
        self.photoAlbum = theAlbum;     
    }
    return self;
}

А потом я перешел на это

- (id)initWithAlbum:(PhotoAlbum *)theAlbum {
    if (self = [super init]) {      
        self.photoAlbum = theAlbum;     
    }
    return self;
}

Примечание: единственная разница в том, что я добавил [super init] для вызова родительского init. После этого изменения вращение работает нормально, и shouldAutorotateToInterfaceOrientation вызывается каждый раз, когда я поворачиваю экран. Надеюсь на эту помощь.

person DaiLak    schedule 21.06.2010
comment
Привет, ДайЛак, ты спас мне жизнь. У меня была та же проблема, что и у вас, и я боролся с ней часами. Спасибо. - person Cullen SUN; 30.12.2011

Может быть несколько возможных причин, по которым ваш контроллер представления не вращается.

См. Официальные вопросы и ответы Apple по этому поводу:

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

http://developer.apple.com/library/ios/#qa/qa2010/qa1688.html

person nybon    schedule 16.10.2010

В Apple Q&A есть подробное решение проблемы.

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

http://developer.apple.com/library/ios/#qa/qa1688/_index.html

Если вы добавляете viewcontroller.view в uiwindow, вы должны установить этот viewcontroller как rootviewcontroller.

[self.window addSubview: mainViewcontroller.view];
self.window.rootViewController=mainViewcontroller;
person Vanguarder    schedule 11.01.2012

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

person Blackmouth    schedule 08.12.2010

У меня была такая же проблема - причина в том, что это был мой первый UIViewController, который я создал на лету в моем ApplicationDelegate, добавил его View в свой UIWindow и сразу же выпустил его.

Это, конечно, неправильно, поскольку я только что добавил UIView UIViewController (сохранив его), а затем выпустил весь контроллер.

Вместо этого вы должны добавить свой первый UIViewController в качестве переменной экземпляра в ApplicationDelegate и выпустить его в методе dealloc вашего ApplicationDelegate.

person Ganayan    schedule 08.01.2011

В моем случае ViewController находился внутри NavigationController, который использовался «родительским» viewControlled, получившим изменения ориентации.

То, что я сделал с этим родителем, было:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{

    if(_navigationController){
        return  [_navigationController.topViewController shouldAutorotateToInterfaceOrientation: toInterfaceOrientation];
    }

    return toInterfaceOrientation == UIInterfaceOrientationPortrait;
}

Таким образом, вы можете реализовать свою собственную логику изменения ориентации в зависимости от видимого в данный момент контроллера.

person htafoya    schedule 26.07.2012

  • (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {return YES; } Вышеупомянутый метод, если вы используете, вы сможете вызывать много раз, если хотите, без каких-либо ошибок.
person Tirth    schedule 10.03.2010
comment
Я использую этот метод. И он вызывается только при загрузке контроллера. - person looneygrc; 10.03.2010

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

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

- (void)orientationChanged:(NSNotification *)notification
{
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
    !isShowingLandscapeView)
    {
        [self presentModalViewController:self.landscapeViewController
                            animated:YES];
        isShowingLandscapeView = YES;
    }
    else if (deviceOrientation == UIDeviceOrientationPortrait &&
             isShowingLandscapeView)
    {
        [self dismissModalViewControllerAnimated:YES];
        isShowingLandscapeView = NO;
    }
}

См. Подробнее здесь.

person Hoang Pham    schedule 10.03.2010
comment
Спасибо за Ваш ответ. Но я не понимаю, почему в других моих контроллерах должно быть достаточно AutorotateToInterfaceOrientation, чтобы повернуть их. И для этого конкретного контроллера мало. Также в других моих контроллерах каждый раз, когда я поворачиваю устройство, должен быть вызван AutorotateToInterfaceOrientation. - person looneygrc; 10.03.2010
comment
Другими словами ... мой контроллер должен вызывать shouldAutorotateToInterfaceOrientation каждый раз, когда я поворачиваю устройство, чтобы проверить, поддерживается ли ориентация. Ну ... мой проблемный контроллер вызывает его только при загрузке, а не при вращении устройства. - person looneygrc; 10.03.2010
comment
Когда устройство вращается, оно спрашивает контроллер, должно ли оно поддерживать вращение, запрашивая shouldAutorotateToInterfaceOrientation :, если ответ - да, то он вызывает willRotateToInterfaceDuration: duration: чтобы увидеть, нужно ли ему делать какие-либо другие изменения. - person Hoang Pham; 10.03.2010
comment
Я это понимаю. Но в моем случае спрашивает только при загрузке контроллера. Если я поверну устройство, оно никогда не спросит. Nvm создаст заново этот контроллер и посмотрю, исправит ли это. - person looneygrc; 11.03.2010
comment
Как я уже говорил, у iphone os нет причин вызывать эту функцию более одного раза. Поэтому вам следует посмотреть в другом месте, чтобы увидеть, что вы можете сделать, чтобы справиться с ориентацией устройства. - person Hoang Pham; 11.03.2010
comment
Хорошо .. понял. Но почему в моем случае он не вращается автоматически? - person looneygrc; 11.03.2010

У меня та же проблема, но с двумя контроллерами представления, добавленными в UIWindow приложения. Причина в том, что свойство UIView контроллера представления встроено в UIWindow, но вместе с дополнительным контроллером представления

От Apple Технические вопросы и ответы

http://developer.apple.com/library/ios/#qa/qa1688/_index.html

person Basem Saadawy    schedule 17.06.2012