Методы делегата ротации устройств UIViewController не вызываются в iOS5 - PullRequest
6 голосов
/ 16 сентября 2011

Я занимаюсь разработкой приложения для iPhone. В этом приложении UIViewController (vc1) представляет другой UIViewController (vc2). vc1 поддерживает как книжную, так и альбомную ориентации; vc2 поддерживает только книжную ориентацию.

  1. Когда представлен vc2, он спрашивает vc1: shouldAutorotateToInterfaceOrientation: и это возвращает YES
  2. В iOS5 (бета-версия 7) willRotateToInterfaceOrientation :, didRotateFromInterfaceOrientation: не вызывается для этой последовательности. Но это прекрасно работает в iOS4. Это ошибка в iOS5?

Ответы [ 2 ]

8 голосов
/ 20 октября 2011

Я сообщил об ошибке в Apple, и получил следующий ответ:

"Инженерная служба определила, что эта проблема ведет себя так, как и предполагалось, на основании следующей информации:

Поведение презентации правильное- если в предыдущих версиях он вел себя по-другому, то это было ошибкой. Возможно, неожиданное изменение в поведении касается отклонения VC1, который больше не получает обратных вызовов вращения, но будет отображаться в портретной ориентации.

Существуют другие способы определениякакова ваша ориентация, когда контроллер представления выдает себя. По разным причинам полагаться на обратные вызовы вращения оказалось проблематичным.

В общем, обратные вызовы вращения viewController происходят в двух случаях:

  1. Изменение ориентации устройства для контроллеров представления в иерархии окон
  2. Смешанные представления ориентации интерфейса. (Нижний контроллер поддерживает только портрет, устройство находится в горизонтальной ориентации и представлен контроллер представления, поддерживающий альбомную ориентацию.) Однако этовозможно является ошибкой.

Попробуйте использовать viewWillLayoutSubviews: в iOS 5. "

4 голосов
/ 17 декабря 2011

Я столкнулся с аналогичной проблемой при тестировании моего приложения на iOS5.Расположение подпредставлений в контроллере основного вида, используемое для того, чтобы испортиться, если ориентация изменилась, когда модальный контроллер вида был активен.

То, что я сделал, это сохранил текущий флаг ориентации в главном контроллере.Этот флаг обновляется в двух местах в главном контроллере

  1. willAnimateRotationToInterfaceOrientation:
  2. viewWillLayoutSubviews (это только для iOS5)

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{    
    // Any orientation is OK
    return YES;
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    portrait = UIInterfaceOrientationIsPortrait(toInterfaceOrientation);

    // Code to update subview layout goes here
}

-(void)viewWillLayoutSubviews
{
    BOOL isPortraitNow = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);

    if(isPortraitNow != portrait)
    {        
        DLog(@"Interfaceorientation mismatch!, correcting");

        portrait = isPortraitNow;

        // Code to update subview layout goes here
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...