Итак, я разрабатываю iPad-приложение, которое поддерживает только ландшафтный режим, за исключением одного модального контроллера. Проблема, с которой я сталкиваюсь, заключается в том, что, когда я представляю модальное представление и меняю ориентацию на портрет, а затем отклоняю представление, родительский вид (который должен поддерживать только пейзаж) находится в портретном режиме, пока я не поверну устройство, на котором оно возвращается пейзаж и остается таким образом. Я избивал себя, пытаясь понять, как заставить родителей смотреть на оригинальную ориентацию, но не смог найти решение.
У меня есть следующий код в моем делете приложения, чтобы разрешить изменения ориентации только для одного модального представления (GalleryPhotoViewer):
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown;
if(self.window.rootViewController){
UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
//Support Portrait mode only on Photoviewer
if ([[presentedViewController presentedViewController] isKindOfClass:GalleryPhotoViewController.class] ) {
orientations = UIInterfaceOrientationMaskAll;
}else{
orientations = [presentedViewController supportedInterfaceOrientations];
}
}
return orientations;
}
Из родительского класса (PhotosViewController) я звоню:
GalleryPhotoViewController *gpView = [GalleryPhotoViewController new];
[self presentViewController:gpView animated:YES completion:nil];
Также в моем родительском (и других представлениях) у меня есть следующий код, чтобы запретить портретный режим:
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if(interfaceOrientation == UIInterfaceOrientationPortrait) {
return YES;
} else {
return NO;
}
}
Любые идеи о том, как я могу сохранить ориентацию на родительском представлении? Я думал о возможно просто программном изменении ориентации на родителя в методе viewWillAppear после отклонения модальности, но тогда я не знал бы, какова была предыдущая ориентация, не говоря уже о том, что я не смог найти код для этого независимо от ios6.
EDIT/SOLUTION: Итак, я нашел решение и то, что я закончил, оставил приложение: supportedInterfaceOrientationsForWindow: код и просто добавление подкласса UINavigation к родительскому представлению, представляющему модальное представление, и все работало как ожидалось, а родительский сохранил свою первоначальную ориентацию, в то время как модальная способность могла свободно меняться.
В моем родителе:
//To make sure that this view remains in Landscape
@implementation UINavigationController (Rotation_IOS6)
-(BOOL)shouldAutorotate
{
return [[self.viewControllers lastObject] shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations
{
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}
@end
Спасибо @matt за предложения.