Переход к ротации ландшафта в контроллере uinavigation - PullRequest
1 голос
/ 27 мая 2010

Я хочу выдвинуть альбомный вид изнутри контроллера uinaviagtion, начальный вид которого - в портретном ... Таким образом, вы нажимаете кнопку или ячейку просмотра таблицы, и экран поворачивается на 90 ° в новом виде.

Как бы я справился с этим? Это похоже на работу приложения Youtube при переходе с экрана информации о фильме к реальному фильму.

(примечание: меня не интересует, в каком повороте пользователь удерживает устройство)

Ответы [ 3 ]

2 голосов
/ 29 мая 2010

Это мое решение, основанное на Эд Марти на этой странице и Саймон здесь - http://simonwoodside.com/weblog/2009/2/27/iphone_programming_how_to_switch/

В предыдущем представлении вызовите его из выбранного метода кнопки или ячейки таблицы

- (void) launchLandscape
{
    LandscapeViewController *controller = [[LandscapeViewController alloc] initWithNibName:@"LandscapeViewControllerView" bundle:nil];
    [self.navigationController setNavigationBarHidden:YES];
    controller.hidesBottomBarWhenPushed = YES;
    [[self navigationController] pushViewController:controller animated:NO];
    [controller release];

}

А потом в альбомной ориентации

- (void)viewWillAppear:(BOOL)animated { 
    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];
    [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeRight;
    CGAffineTransform landscapeTransform = CGAffineTransformMakeRotation( degreesToRadian(90) );
    landscapeTransform = CGAffineTransformTranslate( landscapeTransform, +90.0, +90.0 );
    [self.view setTransform:landscapeTransform];
    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];
}


-(IBAction)backButton:(id)sender
{
    [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
    [[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];
    [self.navigationController setNavigationBarHidden:NO];
    [self.navigationController popViewControllerAnimated:NO];
}

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

2 голосов
/ 05 ноября 2010

То, что появляется в приложении YouTube при переходе от экрана информации о фильме к реальному фильму, не является интерфейсом навигации - это модальное представление. Это всегда работает надежно: если вы отображаете вид модально (используя presentModalViewController) и он может отображаться только в одной ориентации, приложение поворачивается в эту ориентацию.

Итак, решение состоит в том, чтобы не выдвигать свой ландшафтный вид в контроллер навигации; представить его как модальный вид.

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

Теперь единственная проблема заключается в том, что интерфейс навигации в модальном представлении не имеет кнопки «Назад», если мы смотрим на его корневое представление. Это разрушает иллюзию (и затрудняет возвращение пользователя). Решением этой проблемы является хитрость: вставьте альбомную ориентацию дважды в интерфейс навигации, прежде чем представить ее как модальное представление. Таким образом, в интерфейсе навигации отображается представление second в стеке, и поэтому есть кнопка Back. Затем в делегате контроллера навигации поймайте кнопку «Назад» и отклоните модальное представление, когда пользователь пытается вернуться к тому уровню, который, как вы знаете, является корневым. Итак:

- (void) doButton: (id) sender { // appear to navigate into a landscape view
    SecondViewController* sec = [[SecondViewController alloc] init];
    sec.title = self.title; // to give the correct Back button title
    UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:sec];
    SecondViewController* sec2 = [[SecondViewController alloc] init];
    [nav pushViewController:sec2 animated:NO];
    [self presentModalViewController:nav animated:YES];
    nav.delegate = self; // so that we know when the user navigates back
}

// and here's the delegate method
- (void)navigationController:(UINavigationController *)navigationController 
      willShowViewController:(UIViewController *)viewController 
                    animated:(BOOL)animated {
    if (viewController == [navigationController.viewControllers objectAtIndex:0])
        [self dismissModalViewControllerAnimated:YES];
}
2 голосов
/ 28 мая 2010

Реализуйте следующий метод, который должен вызываться, когда представление помещается в стек навигации:

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

Это должно автоматически повернуть все вбок, как только вы положите его в стек, поскольку представление не поддерживает портретную ориентацию.

Если я ошибаюсь и это не так, вы всегда можете принудительно установить горизонтальную ориентацию, установив в строке состояния ориентацию:

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:animated];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...