2010-09-22 3 views
6

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

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

У меня есть еще одна кнопка, которая вызывает почтовый композитор, который имеет одинаковое поведение. Вот код в моем 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]; 
} 

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

+0

Вы на последней версии ОС? У меня были проблемы с толканием пейзажного модального вида, в то время как в портрете на 3.1.3 ... –

+0

Да, я запускаю 4.0 SDK ... – Glasswing

ответ

-1

Вам не нужен новый Navigation Controlle 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]; 
} 
+0

Я удалил навигационный контроллер и по-прежнему получаю то же поведение. Большое спасибо за ответ. Любые другие идеи? – Glasswing

7

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

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

+0

Спасибо за ответ так быстро! Я попытался поместить код statusBarOrientation в мой вид ViewViewControllerWillAppear, и я по-прежнему получаю такое же поведение! Я также удалил новый контроллер навигации и все еще ничего не получил ... только белый экран. Любые другие предложения? – Glasswing

+0

Можете ли вы опубликовать код для функции initWithPrimaryKey? Проводка некоторого кода в этом файле поможет очень! – MishieMoo

+0

Функция init проста ... xib-файл - это просто UIView с UITextView под ним. – Glasswing

2

Вау, я потерял дни над этим вопросом ... но я нашел решение!

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

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

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

Метод «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

Это тоже сработало для меня. Вы не использовали BCTabBarController при любых изменениях, не так ли? Так много проблем для этих маленьких оживлённых стрел ... –

2

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

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

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

+0

борется с этим точным вопросом и забыл, что по умолчанию XCode 4 добавляют: '- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation { возвращения (interfaceOrientation == UIInterfaceOrientationPortrait); } ' Неудивительно, что это был всегда портрет .... * вздох * –

0

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

Showing pushviewcontroller animation look like 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]; 

Надеется, что это помогает ..

0

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

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