Xcode - заблокировать все виды в портретной ориентации, кроме одного, с помощью XIB

Мне нужна помощь.

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

Я искал это уже около недели и до сих пор не могу решить проблему.

Буду признателен за помощь заранее спасибо.


person Steelzeh    schedule 05.04.2014    source источник


Ответы (1)


Это имеет два аспекта. 1. Как заблокировать ориентацию для каждого контроллера представления по мере необходимости.

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

Итак, 2. вам нужно повернуть устройство.

Пункт 1 прост.

Реализуйте это во всех контроллерах, которые исправлены для портрета:

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

И реализуйте это для ландшафтных контроллеров:

- (BOOL)shouldAutorotate
{
    return YES;
}


- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscape;
}

<сильный>2. Для следующего шага вам нужно применить хитрость. Вы не можете программно повернуть устройство. Единственный способ добиться этого — повернуть строку состояния. После этого следующий модальный (!) контроллер представлен в новой ориентации. Это не работает для размещения контроллеров в стеке навигации. Хитрость заключается в том, чтобы модально представить любой (пустой) контроллер представления и сразу же удалить его. Теперь устройство повернуто, и вы можете поместить контроллер представления в стек. Это код, который я использовал на днях:

// Fetch the status bar from the app and set its orientation as required. 
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:YES];

// Create an empty view controller, present it modally and remove it directly afterwards
UIViewController *mVC = [[UIViewController alloc] init];
[self presentModalViewController:mVC animated:NO];
[self dismissModalViewControllerAnimated:NO];
// Now the device is rotated to the desired orientation. Go from there.

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

person Hermann Klecker    schedule 05.04.2014
comment
Кажется, это не работает для меня. Итак, в настройках моего проекта я разрешил повороты: Портрет, Пейзаж влево, Пейзаж вправо. Я ввел код для ландшафта в моем viewController, затем я использовал код, который вы предоставили, прежде чем я нажму на свой следующий контроллер представления, который должен быть в ландшафте. Как только меня нажимают, я вручную поворачиваю вид, и он остается, но как только я поворачиваю его обратно в портрет, он снова поворачивается вместе со мной. Теперь я не уверен, но я думаю, что проблема может заключаться в том, что мой rootViewController является вкладкой, и код не запускается, я прав? Спасибо еще раз. - person Steelzeh; 06.04.2014
comment
Спасибо, у меня получилось с вашим ответом. В моем appdelegate я установил rootviewcontroller как TabBarController, я изменил его на [self.window addSubview: tabController.view]; и это сработало для меня. - person Steelzeh; 06.04.2014
comment
А, это очень хороший момент. И позор мне, я сам столкнулся с той же проблемой. Когда вы используете панель вкладок, вызывается supportedInterfaceOrientation контроллера панели вкладок. Это означает, что вы должны подклассифицировать контроллер панели вкладок и использовать некоторый механизм (Varialbe в делегате приложения или какой-либо синглтон или каким-то образом сделать контроллер панели вкладок доступным из каждого контроллера представления), который позволяет контроллеру панели вкладок реагировать соответствующим образом - в зависимости от вида. контроллеры в настоящее время отображаются (или будут отображаться). - person Hermann Klecker; 06.04.2014
comment
Ну да, я только что сделал собственный TabBarController и импортировал его в каждое представление, в котором использовалась панель вкладок. Но опять же, без вашего кода я бы не заработал, так что спасибо. - person Steelzeh; 06.04.2014