UIViewController вращаются методы

голоса
17

Какой объект отвечает за dipatching на UIViewControllerвызовы методов вращения, то есть:

  • shouldAutorotateToInterfaceOrientation:
  • willRotateToInterfaceOrientation:duration:
  • willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:
  • willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:
  • didRotateFromInterfaceOrientation:

Я полагаю , что это UIApplication(но , возможно, AppDelegate или UIWindow).

Следующий вопрос, каким образом объект узнать , какие UIViewControllerпоговорить?

Как это узнать , какой UIViewControllerимеет вид как подвид окна?

Есть сообщение , которое можно отправить или свойство можно установить (какой - либо объект) , который устанавливает «Active» UIViewControllerдля приложения?

Задан 14/02/2009 в 00:50
источник пользователем
На других языках...                            


4 ответов

голоса
13

Кажется , что UIApplicationэто диспетчерская сообщения для активного контроллера представления.

Но как ваш экземпляр View Controller получить эти сообщения?

Сообщение пересылается на первый контроллер представления которого вид был добавлен к UIWindowпримеру.

Это сводится к 3 основным сценариям:

  1. ViewController которого вид добавляется непосредственно к UIWindow примеру (один вид приложения)

  2. Навигационный контроллер в приложении на основе навигации, то навигационный контроллер передает сообщение с активными видами просмотра контроллера.

  3. Панель вкладок контроллер в приложении на основе панели вкладок, то контроллер панели вкладок передает сообщение к активному виду просмотр контроллера (или активному контроллеру навигации).

Проблема у вас будет, если вы создать приложение с несколькими видами, но НЕ используйте Навигационный контроллер или контроллер панели вкладок. Если поменять взгляды в и из UIWindowэкземпляра вручную, вы не будете получать эти сообщения надежно. Это похоже на посты как этот: iPhone viewWillAppear не стрелять

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

Ответил 19/02/2009 в 05:49
источник пользователем

голоса
4

Как это узнать, какой UIViewController имеет вид как подвид окна?

UIViewController класс поддерживает статическую карту между видами и их контроллерами зрения. Эта карта запрашивается в нескольких ключевых местах внутри CocoaTouch. В частности, [UIView nextResponder] запрашивает его и возвращает контроллер, если найден.

Я предполагаю, что UIWindow делает то же поиск с корневой точкой зрения, чтобы знать, какой контроллер направить событие вращения на. Будет ли проверить это в следующий раз, когда я буду искать что-то в разборке. (Я провел некоторое время обратного проектирования CocoaTouch, чтобы понять, как работают там вещи.)

Ответил 06/05/2009 в 12:15
источник пользователем

голоса
4

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

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


Обновление: Это было действительно частной магией в 2009 году , когда я впервые написал этот ответ, но последующие изменения прошивки сделали API , за ним общественность. - Контроллер Корневой теперь доступен через UIWindow.rootViewControllerсобственность, и дерево потомков контроллеров отображения формируется с помощью UIViewController.childViewControllersсвойства.

Родительские контроллеры вид несут ответственность за уведомление своих детей об изменениях ориентации. (Я не знаю , как контроллер представления корня уведомляются, но вы можете установить контрольную точку и узнать себя) . В -shouldAutomaticallyForwardRotationMethodsметоде решает , будет ли UIViewController сделать это для вас. Если он возвращается NO, вы становитесь ответственным за это в ваших -willRotateToInterfaceOrientation:duration:, -willAnimateRotationToInterfaceOrientation:duration:и -didRotateFromInterfaceOrientation:методах.

Ответил 14/02/2009 в 01:42
источник пользователем

голоса
1

У меня аналогичная проблема.

У меня есть игра работает в альбомной ориентации (как левый и правый пейзаж).

Для управления приложения в нескольких проекциях, я использую корень UIViewController, т.е. фиктивный UIViewController с UIView, который ничего не делает. Я затем добавить все остальные UIView к нему как подвид.

При запуске приложения, эмулятор быстро вращается в портретной ориентации, и я получаю каждый из моих взглядов с его свойство рамка выглядит как (0, -80,320,480). Это приводит к тому мнению быть обрезаны с помощью 160 х 320 прямоугольник на правой стороне.

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

Неудивительно, что любые один из - willAnimate вызовов * методов направляются только в целях корня, поэтому, определяя любой из этих методов в подобозрениях бессмысленно.

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

Для достижения этой цели я определил следующий метод в моем классе RootViewController:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
    subview1_ViewController.view.frame = CGRectMake(0,0,480,320);
    subview2_ViewController.view.frame = CGRectMake(0,0,480,320);
        ...
}

Я не понимаю, почему свойство кадра не обновляется, но я знаю, что это временное решение работает.

Надеюсь это поможет....

Ответил 25/03/2010 в 05:20
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more