2010-09-20 2 views
2

Когда приложение находится в ландшафтном режиме (который я планирую принудительно), отображение модального представления приводит к тому, что родительское представление поворачивается в портретный режим. Если я установил возвращаемое значение shouldAutoRotateToInterfaceOrientation равным NO, родительский элемент не вращается, однако модальный затем соскальзывает сбоку и отображается сбоку. Ниже приведен код, который показывает модальность.iPad Modal View вращает parentViewController View

- (IBAction)loadExistingGame:(id)sender { 

SavedGamesTableViewController *savedGames = [[SavedGamesTableViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
savedGames.modalPresentationStyle = UIModalPresentationFormSheet; 
[self presentModalViewController:savedGames animated:YES]; 

[savedGames release]; 

}

По желанию здесь содержание метода shouldAutoRotate в SavedGamesTableViewController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Override to allow orientations other than the default portrait orientation. 
return YES; 

}

+0

Пожалуйста, покажите реализацию 'shouldAutoRotateToInterfaceOrientation' внутри SavedGamesTableViewController. –

+0

Добавлен метод, однако это только код, сгенерированный котельной. – Kyle

ответ

2

Хорошо, я понял, что нужно сделать, чтобы исправить это. Файл plist, содержащий список возможных ориентаций, должен быть ограничен одним видом ландшафта. Родительу в представлении модальной таблицы необходимо, чтобы метод shouldAutoRotateToInterfaceOrientation возвращал ДА только в том случае, если ориентация соответствует единственной ориентации в файле plist.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Overriden to allow any orientation. 
return interfaceOrientation = UIInterfaceOrientationLandscapeRight; 

}

модальный ViewController должен возвращать NO для того же метода.

0

На основании

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

и

По желанию здесь является содержание метод shouldAutoRotate из SavedGamesTableViewController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Override to allow orientations other than the default portrait orientation. 
return YES; 
} 

Так что вы говорите, что контроллер родительского вида пока еще не настроен на использование только с использованием ландшафтной ориентации, и когда вы показываете модальное представление, которое настроено на разрешение всех ориентаций, вы w почему ваш родительский взгляд поворачивается к портрету при повороте устройства на портрет? Я не понимаю ваш вопрос ... разве вы не говорите, что контроллер родительского представления в настоящее время настроен на разрешение поворота на портрет? Разве это не то, что должно произойти?

+0

Нет устройства, которое не вращается. Когда отображается модальный вид, родительский режим модально вращается. – Kyle

+0

Помимо «SavedGamesTableViewController», есть ли на экране другой контроллер? В документах указано, что все экранные контроллеры должны согласовать авторотацию, чтобы он произошел; если только один из ваших контроллеров просмотра на экране в этом модальном диалоговом окне настроен только на портрет, то он будет отображаться только в портрете. –

+0

Единственным другим контроллером на экране является tableviewcontroller, содержащимся в модальном режиме. Он имеет тот же шаблонный код для метода toautorotate .... – Kyle

0

У меня была аналогичная проблема при создании модального вида почты. Принуждение к вращению не сработало для меня, но вызов currentModalViewController на главном контроллере приложения, а не контроллер детского представления, решил проблему.

+0

Не трюк. Я даже использую window.rootViewController, но все равно никаких изменений. – stigi

0

Я видел такое же поведение; в моем случае проблема заключалась в том, что я реализовал shouldAutorotateToInterfaceOrientation, чтобы безоговорочно вернуть YES для родительского контроллера представления, но НЕ для представленного контроллера модального представления. Поэтому я подозреваю, что комментарий Shaggy Frog - это ключ: хотите ли вы принудительно использовать ландшафтный режим или нет, вам нужно убедиться в том, что две версии контроллеров представлений должны быть реализованы с использованием AutorotateToInterfaceOrientation или произойдет странность.

0
UIViewController *vc = /* create view controller */; 
UINavigationController *nc = nil; 
if (IOS_VERSION_LESS_THAN_6_0) { 
    nc = [[MyCustomNavigationControllerSupportingAllOrientations alloc] initWithRootViewController:vc]; 
} else { 
    nc = [[UINavigationController alloc] initWithRootViewController:vc]; 
} 
[self.navigationController presentModalViewController:nc animated:YES]; 

На iOS6 я использую UINavigationController.

На предварительной iOS6 I подкласс UINavigationController, как это:

@interface MyCustomNavigationControllerSupportingAllOrientations : UINavigationController 
@end 

@implementation MyCustomNavigationControllerSupportingAllOrientations 
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 
@end