"didRotateFromInterfaceOrientation:" не вызывается - PullRequest
2 голосов
/ 11 октября 2011

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

Ответы [ 6 ]

17 голосов
/ 26 января 2013

didRotateFromInterfaceOrientation будет вызываться (в childViewController), только если вы добавите childViewController в parentViewController следующим образом:

[parentViewController addChildViewController:childViewController];

Обратите внимание, что вы все равно можете включить или выключить это поведение с помощью свойства:

self.automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers

По умолчанию установлено значение YES, поэтому вам не нужно прикасаться к нему. Устаревший после iOS 6.0 Приветствия

5 голосов
/ 11 октября 2011

У вас есть более 1 UIViewController, активно отображающий его вид на экране одновременно?iOS действительно только ожидает 1 представление, принадлежащее UIViewController на экране сразу.Если их больше 1, то только методы UIViewController с полноэкранным представлением будут вызывать методы изменения ориентации.

2 голосов
/ 30 января 2016

Я просто хотел опубликовать продолжение этого вопроса.После iOS 8 методы rotate устарели, и вместо этого вы переопределяете viewWillTransitionToSize () в контроллере дочернего представления.

ПРИМЕЧАНИЕ. Похоже, что для этого метода требуется добавить дочерний контроллер представления, как описано выше.Я построил свой тест, используя раскадровку и NavigationController, и выдвинул новый контроллер представления при нажатии кнопки.

Я установил точку останова для этой функции и когда использовал отладчик для проверки: self-> parentViewController->childViewControllers, childViewControllers был равен нулю.

1 голос
/ 12 августа 2014

По документу Apple "Когда вращение происходит для контроллера видимого представления, willRotateToInterfaceOrientation: duration :, willAnimateRotationToInterfaceOrientation: duration :, и didRotateFromInterfaceOrientation: методы вызываются во время поворота. Метод viewWillLayoutSubviews также вызывается после того, как представление вызывается, а представление также вызывается после того, как представление перерезаетсяпозиционируется его родителем. Если контроллер представления не виден, когда происходит изменение ориентации, то методы поворота никогда не вызываются. Однако метод viewWillLayoutSubviews вызывается, когда представление становится видимым. Ваша реализация этого метода может вызывать метод statusBarOrientation дляопределить ориентацию устройства. "

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

1 голос
/ 15 июля 2014

У меня была такая же проблема. В основном

didRotateFromInterfaceOrientation:

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

 [self addChildViewController:YourUIViewController];
0 голосов
/ 11 октября 2011

Это проблема жизни контроллера. Я подозреваю, что вы создали экземпляр контроллера и добавили подпредставление, а затем выпустили экземпляр. Теперь, если вы вращаете устройство, вы не вызываете дополнительные методы делегирования вращения подпредставления.

Вторая причина заключается в том, что всякий раз, когда вы добавляете делегат родительского представления только для подпредставления, будет вызываться, потому что вызывающая сторона имеет только экземпляр контроллера родительского вида. Вызывающим абонентом может быть навигационный контроллер (приложение на основе навигации), tabbarcontroller (в случае приложения на основе вкладок). Если вы хотите вызывать метод subview в ротации, вам нужно будет вызвать его явно следующим образом:

if(subviewController != nil){

  if([subviewController respondToSelector(rotateMethodOfSubView:)])

     [subViewController performSelector(rotateMethodOfSubView:) withObject: self];

} 

Это должно помочь решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...