View Controller внутри View Controller не будет получать сообщения о ротации - ios - PullRequest
1 голос
/ 19 июля 2011

У меня есть настроенный View Controller (назовем его оболочкой ).Его вид содержит только UIScrollView.Представление прокрутки содержит другой настроенный контроллер представления (назовем его представлением внутри ), инициализированное из файла XIB (само представление прокрутки также инициализируется из файла XIB, но я не верю,это имеет значение).

Представление оболочки отображается с помощью UITabBarController, который содержит еще несколько аналогичных контроллеров представления.

У меня есть странная проблема: функции вращения оболочки - shouldAutoRotate,willAnimateRotation - мне звонят каждый раз, когда я поворачиваю устройство.По некоторым причинам функции вращения внутреннего вида не вызывают, но они все еще вращаются.Внутренний вид shouldAutoRotate вызывается при его инициализации (при запуске приложения).

Я посмотрел на Google и не смог найти ничего, что имеет отношение к моему делу.Я не уверен, что это связано, но Авторазмер подвидов проверен на всех файлах XIB.

Я был бы рад, если бы вы могли помочь мне решить эту проблему.Мне нужна функция вращения внутреннего вида, чтобы вызываться при вращении, чтобы упорядочить ее вручную, но я бы не хотел вызывать их из представления обтекания (скорее, чтобы оно работало как надо).

Спасибозаранее!

Ответы [ 3 ]

1 голос
/ 19 июля 2011

Самый простой способ - это сохранить UIInnerViewController* innerController в вашем .h файле и в .m для вызова inner - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation Внутри обёртки вот так:

wrapper.m
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
    BOOL innerResult = [innerController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    //may be more computations here
    return innerResult;// or any other value, based on your needs
}

Другой подход, который вы можете использовать, - это зарегистрировать внутренний контроллер в UIDeviceOrientationDidChangeNotification следующим образом:

[[NSNotificationCenter defaultCenter] addObserver:self 
                                      selector:@selector(orientationChanged:) 
                                      name:UIDeviceOrientationDidChangeNotification 
                                      object:nil];

и макеты подпредставлений в -(void)orientationChanged:(NSNotification*)notification; в том же внутреннем контроллере. Единственное, о чем вам следует помнить, это то, что UIDeviceOrientation немного отличается от UIInterfaceOrientation и может содержать значение UIDeviceOrientationFaceUp, которое в большинстве случаев неприменимо к изменениям пользовательского интерфейса.

1 голос
/ 19 июля 2011

Что ж, функция поворота innerViewController не будет вызываться, потому что они добавляются в качестве подпредставления к вашему scrollView, и вы можете генерировать NSNotification при изменении ориентации в родительском контроллере, тогда вы можете получать уведомления в подпредставлении и управлять ими соответствующим образом. Или вы можете перебирать подпредставления UIScrollView, когда ваш shouldAutoRoatate вызвал ваш родительский контроллер, а затем вручную вызвал метод автоматического выбора дочерних представлений. Надеюсь, вы понимаете.

0 голосов
/ 19 июля 2011

Вложение viewcontrollers внутри пользовательских viewcontrollers не поддерживается в iOS 4. Обычно вы можете пересылать все необходимые сообщения на ваш дочерний VC вручную, но с приемлемыми результатами.

...