Контроллер модального вида не запускается в ландшафтном режиме

У меня есть приложение на основе навигации, которое имеет подробный вид (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];
}

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

 tc.23 сент. 2010 г., 02:14
Вы на последней версии ОС? У меня были проблемы с перемещением только модального вида в альбомной ориентации в 3.1.3 ...
 Glasswing23 сент. 2010 г., 04:30
Да, я использую 4.0 SDK ...

Ответы на вопрос(7)

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

У меня была та же проблема, что и у вас: метод 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:". Тогда это будет работать!

 Craig McMahon02 дек. 2011 г., 03:37
Это также сработало для меня. Вы не использовали BCTabBarController, не так ли? Так много проблем для этих маленьких оживляющих стрелок ...

оллера. Убедитесь, что правильно реализовали: shouldAutorotateToInterfaceOrientation

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

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

 Josh Peak29 июн. 2012 г., 02:40
боролся с этой проблемой и забыл, что по умолчанию XCode 4 добавляет:- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ return (interfaceOrientation == UIInterfaceOrientationPortrait); }  Неудивительно, что это всегда был портрет ....вздох

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

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

и вы можете закрыть 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];

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

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

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];

Вам не нужен новыйУправление навигациейр.

- (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];
}
 Glasswing22 сент. 2010 г., 20:05
Я удалил навигационный контроллер и все еще получаю то же самое поведение. Большое спасибо за ответ. Есть другие идеи?

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

Кроме того, вам не нужен setNeedsDisplay. Это влияет только на текущие представления, а не на модальные, которые вы представляете.

 MishieMoo22 сент. 2010 г., 20:18
Можете ли вы опубликовать код для функции initWithPrimaryKey? Размещение некоторого кода в этом файле очень поможет!
 Glasswing22 сент. 2010 г., 20:29
Функция init проста ... xib-файл - это просто UIView с UITextView.
 Glasswing22 сент. 2010 г., 20:29
Ой ... позвольте мне попробовать это снова ... увидеть следующий ответ ....
 Glasswing22 сент. 2010 г., 20:45
На самом деле перо это просто UIView, и я создаю UITextView программно. (Я пробовал оба способа ...)
 Glasswing24 сент. 2010 г., 17:26
Ага. Текстовое представление создается. Я установил фоновое представление на синий и текстовое представление на красный (для отладки). Я даже прокомментировал создание подпредставления textview. Когда я открываю вид заметок (синий) в альбомной ориентации, он по-прежнему показывает белый экран (не синий). Я думаю, что, возможно, это связано с рамками / макетами / слоями? Я полностью в тупик ...
 MishieMoo23 сент. 2010 г., 16:07
Вы пробовали регистрировать свои подпредставления? Добавьте NSLog в viewWillAppear, который распечатывает подпредставления (self.view.subviews), чтобы убедиться, что ваши текстовые поля действительно создаются. Они? Вы прошли через это в отладчике?
 Glasswing22 сент. 2010 г., 20:05
Спасибо за быстрый ответ! Я попытался поместить код statusBarOrientation в представление NotesViewController viewWillAppear, и я все еще получаю то же самое поведение! Я также удалил новый контроллер навигации и до сих пор ничего не получаю ... только белый экран. Любые другие предложения?

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];

Ваш ответ на вопрос