Контроллер модального вида не запускается в ландшафтном режиме - PullRequest
6 голосов
/ 22 сентября 2010

У меня есть приложение на основе навигации, которое имеет подробный вид (UIWebView) с кнопками действий в нижней части панели инструментов UITool.Я хочу добавить «заметки», когда нажата кнопка «заметки».Все отлично работает, когда веб-просмотр находится в портретном режиме.Я нажимаю кнопку заметок, модальное представление открывается нормально и прекрасно работает.

Проблема возникает, когда веб-просмотр находится в ландшафтном режиме.Если я нажимаю кнопку заметок, весь код, открывающий модальное представление, вызывается, но все, что я получаю, это белый экран.Один комментарий: если я открою модальное представление в портретной ориентации, а затем поверну устройство, оно прекрасно поворачивается в ландшафтный режим.Он просто не будет открывать правильно в ландшафтном режиме.

У меня есть еще одна кнопка, которая вызывает почтовый композитор, который ведет себя идентично.Вот код в моем UIWebViewController:

- (IBAction)addNotes:(id)sender 
{
    NotesViewController *notesViewController;

    // create the view controller and set it as the root view of a new navigation
    // controller

    notesViewController = [[NotesViewController alloc] initWithPrimaryKey:self.record.primaryKey];
    UINavigationController *newNavigationController =  
    [[UINavigationController alloc] initWithRootViewController:notesViewController];

    // present the navigation controller modally

    [self presentModalViewController:newNavigationController animated:YES];
    [notesViewController release]; 
    [self.view setNeedsDisplay]; // not sure if I need this!  I was trying different things...
    [self.devotionText setNeedsDisplay]; // ditto...
    [newNavigationController release];
}

Есть идеи?Я перепробовал разные вещи безрезультатно.У меня просто белый экран без панели навигации (хотя вверху есть строка состояния).

Ответы [ 7 ]

7 голосов
/ 22 сентября 2010

Модалы не всегда получают информацию о вращениях, и они получают информацию из строки состояния, которая не всегда работает правильно.Поместите это в ваш viewWillAppear, чтобы исправить: [UIApplication sharedApplication].statusBarOrientation = self.interfaceOrientation И, если вы хотите, чтобы внутри вашего модала был навигационный контроллер, вам нужно его создать.Это влияет только на текущие представления, а не на модальные, которые вы представляете.

4 голосов
/ 04 августа 2012

Ответ здесь:

https://stackoverflow.com/a/10250747/1449618

Use the window's root view controller to present:

[self.view.window.rootViewController presentViewController:masterView
                                                  animated:YES
                                                completion:NULL];
2 голосов
/ 16 ноября 2011

Возникла та же проблема при модальном представлении контроллера навигации. Убедитесь, что правильно реализовали: shouldAutorotateToInterfaceOrientation

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    BOOL shouldAutorotate = NO;
    if( isControllerMangingAllOrientations )
    {
        shouldAutorotate = YES;
    }
    else
    {
        shouldAutorotate = (toInterfaceOrientation == UIInterfaceOrientationPortrait);
    }
    return shouldAutorotate;
}

Я устанавливал логическое значение в методе viewDidLoad, не очень хорошая идея. Помещение в initWithNibName: bundle: метод - правильное место.

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

Ух ты, я потерял несколько дней из-за этой проблемы ... но я нашел решение!

У меня была та же проблема, что и у вас: метод presentModalViewController: animated: работал только в портретном режиме.

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

Итак, мой корневой контроллер представления имел корневой объект представления и несколько дочерних контроллеров представления.Когда дочерний контроллер представления был активирован, его объект представления был добавлен как подпредставление к представлению корневого контроллера представления.

Методу presentModalViewController это не понравилось.Однако, как только я установил свойство parentViewController дочерних контроллеров представления, это сработало!

Проблема только в том, что parentViewController является свойством только для чтения.Вы должны расширить класс UIViewController, чтобы иметь к нему доступ.

@interface UIViewController (HelperExtension)

@property (nonatomic, assign) UIViewController *parent;

@end

@implementation UIViewController (HelperExtension)

- (UIViewController *)parent
{
    return self.parentViewController;
}

- (void)setParent:(UIViewController *)parent
{
    [self setValue:parent forKey:@"_parentViewController"];
}

@end

Таким образом, всякий раз, когда вы добавляете представление дочернего контроллера представления в ваш родительский контроллер представления, вызывайте метод "setParent:" после выполнения этого.,Тогда это будет работать!

0 голосов
/ 05 августа 2015

У меня была задача показать видеоплеер в ландшафтном режиме.

AVPlayerViewController *playerViewController = [AVPlayerViewController new];
//Player init code goes here....

// #define degreesToRadian(x) (M_PI * (x) / 180.0) - was defined previously in a class header

playerViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
playerViewController.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
playerViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);

[self presentViewController:playerViewController animated:YES completion:nil];
0 голосов
/ 11 июня 2014

Если вы используете presentModalViewController только для анимации, как я, вы можете использовать pushViewController с анимацией, как показано ниже;

Отображение анимации pushviewcontroller выглядит как подарокModalViewController

и вы можете закрыть viewController, как показано ниже;

CATransition* transition = [CATransition animation];
transition.duration = 0.3;
transition.type = kCATransitionFade;
transition.subtype = kCATransitionFromTop;

[self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
[self.navigationController popViewControllerAnimated:NO];

Надеюсь, это поможет ..

0 голосов
/ 22 сентября 2010

Вам не нужен новый Регулятор навигации r.

- (IBAction)addNotes:(id)sender {

 NotesViewController *notesViewController;

 // create the view controller and set it as the root view of a new navigation
 // controller

 notesViewController = [[NotesViewController alloc] initWithPrimaryKey:self.record.primaryKey];

 [self.navigationController pushViewController: notesViewController animated: YES];
 [notesViewController release];
}
...