2015-01-05 4 views
1

У меня есть пользовательский контейнер UIViewController. Контейнер содержит двое детей UIViewControllers. Мне нужно отключить поворот для одного из них.iOS 8 Container View Контроллер вращение детей

Документация гласит:

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

Но -(BOOL)shouldAutorotate никогда не вызывали детей.

Как отключить поворот для контроллера детского вида в iOS 8?

ответ

3

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

Метод, на который вы ссылаетесь, -shouldAutoRotate, применяется только к представлению верхнего уровня viewController. Поля зрения не вращаются, относительно говоря. Но они могут корректироваться в соответствии с новой компоновкой.

Что вы, вероятно, хотите сделать, это контрротировать «статический» вид, чтобы он сохранял фиксированный аспект относительно экрана.

Док вы цитируете из имеет в виду этих методов (предварительное ios8)

– willRotateToInterfaceOrientation:duration: 
– didRotateFromInterfaceOrientation: 

в ios8 они устарели и заменены

- viewWillTransitionToSize:withTransitionCoordinator: 

Если вы используете этот метод, вы будете необходимо проверить ориентацию от [UIDevice currentDevice] и выполнить регулировку против вращений (которая будет преобразованием вращения).

Если это не сработает для вас, всегда можно создать собственное представление и иметь его (или viewController) для уведомлений о ротации устройства. Для этого нужно отправить beginGeneratingDeviceOrientationNotifications в [UIDevice currentDevice] и затем зарегистрировать для этих уведомлений с центром уведомлений: «что о кадре»

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

редактировать

Что о кадра? Здесь это не актуально.Вы примените преобразование вращения к своему «невращающему» виду. Apple советует никогда не получать или не устанавливать свойство кадра после применения преобразований, поскольку числа больше не имеют смысла. Вы можете установить границы и свойства центра, или, возможно, лучше использовать ограничения автоопределения или авторезистирующую маску, чтобы получить результат.

edit2

Вот (анимации) Пример использования viewWillTransitionToSize:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 

    UIDeviceOrientation deviceOrientation = 
     [UIDevice currentDevice].orientation; 
    CGAffineTransform transform = 
     [self transformForOrientation:deviceOrientation]; 
    CGPoint center = 
     [self centerForOrientation:deviceOrientation]; 
    [UIView animateWithDuration:0.2 animations:^{ 
     self.rotatingView.center = center; 
     self.rotatingView.transform = transform; 
}]; 
} 

, где transformForOrientation будет возвращать соответствующее преобразование поворота, и centerForOrientation будет возвращать центр, производный от центра оригинального неповёрнутых зрения в координаты.

Использование viewWillTransition позволяет вам управлять поворотом до, интерфейс повернулся к новой ориентации устройства. На этом этапе UIDeviceOrientation даст вам правильную ориентацию адресата, в то время как UIInterfaceOrientation все равно вернет предварительно повернутый аспект. Если вам нужна очень плохая координация между анимациями, вы можете использовать объект UIViewControllerTransitionCoordinator.

+0

Что относительно рамки? – orkenstein

+0

@orkenstein - см. Мое обновление – foundry

+0

Ограничения имеют смысл для меня, я могу динамически изменять постоянную высоту/ширину. Но авторезистирующую маску? Я всегда думал, что аффинное преобразование применяется после макета. – orkenstein

1

В контроллере представления

- (NSUInteger)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationMaskPortrait; 
} 
+0

Спасибо. Не работает в моем случае. – orkenstein

+0

Это не сработает, если другой viewController возвращает противоречивый ответ в то время – Jef

1

Я не думаю, что вы можете. Когда приложение запрашивает viewController для поддерживаемых ориентаций, он проверяет только один из них, а затем делает преобразование во всем окне. Лучшее, что я могу предложить, - это аффинное преобразование в представлении контейнера рассматриваемого контролера, чтобы перевернуть/компенсировать поворот.

+0

Как насчет рамки? – orkenstein

Смежные вопросы