Использование переходов для автоматического поворота представлений

У меня есть UIViewController в альбомной ориентации, который модально отображает UINavigationController в портретной ориентации. Когда я использую модальное переходное соединение для перехода от контроллера представления к контроллеру навигации, по какой-то причине изначально контроллер представления принудительно переходит в портретную ориентацию (когда изначально он должен быть в альбомной ориентации). Когда я удаляю переход, все работает как положено.

Желательно использовать модальный переход от интерфейса в альбомной ориентации к другому интерфейсу в портретной ориентации.

Есть идеи, что здесь происходит? Или как заставить работать как задумано?


person Dany Joumaa    schedule 30.12.2011    source источник


Ответы (2)


Используйте уведомления.

-(void)viewWillAppear:(BOOL) animated{
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver: self selector:@selector(receivedRotate:) name: UIDeviceOrientationDidChangeNotification object: nil];
}

-(void) receivedRotate: (NSNotification*) notification
{
UIDeviceOrientation interfaceOrientation = [[UIDevice currentDevice] orientation];
if(interfaceOrientation == UIInterfaceOrientationLandscapeLeft)
{
  [self performSegueWithIdentifier:@"/* Segue from the VCPotrait to VCLandscape*/" sender: self];
}
}

Переход должен быть модальным.

person Faser    schedule 30.12.2011
comment
Эм, я думаю, вы неправильно поняли мой вопрос. Я хочу знать, как заставить iPhone менять ориентацию, когда он открывает контроллер модального представления. Я уже знаю, как работать с ориентациями, вызванными пользователем. - person Dany Joumaa; 31.12.2011
comment
Думаю, есть свойство ориентации устройства. Это должно позволить вам установить ориентацию. - person Faser; 01.01.2012
comment
Если вы имеете в виду свойство ориентации UIDevice, оно доступно только для чтения. - person Dany Joumaa; 01.01.2012

Вы имеете в виду, что изначально контроллер навигации настроен на портретную ориентацию?

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}

Я думаю, вы захотите создать подкласс UINavigationController, чтобы иметь возможность установить это.

Переход определяется как модальный в раскадровке, и код в первом контроллере представления (презентатора) выглядит вполне нормально:

-(IBAction) zoomIn:(id)sender {
    [self performSegueWithIdentifier:@"ZoomIn" sender: self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"ZoomIn"]) {
        OSZoomViewController *zoom = [segue destinationViewController];
        zoom.image = ...;
        zoom.presenter = self;
    } 
}
person Aneel    schedule 13.05.2012