iOS6.0 Нажатие нового viewController в книжной ориентации из альбомной viewController
Мое приложение основано на навигации и в основном работает в портретной ориентации, но один контроллер представления поддерживает как книжную, так и альбомную ориентацию. Теперь проблема в том, что, когда я выталкиваю новый контроллер вида из контроллера ландшафтного вида, новый контроллер вида также выдвигается в ландшафтном режиме, хотя я хочу его в портретном режиме.
Также, когда я выскакиваю контроллер вида из контроллера ландшафта, тогда контроллер всплывающего вида отображается в портретном режиме.
Я не знаю, что не так с моим кодом.
Вот мой фрагмент кода и информация, используемая для поддержки ориентации.
В файле info.plist я сохранил поддержку всей ориентации, кроме переворачивания портрета.
Я также добавил категорию для категории контроллера навигации, как показано ниже.
@implementation UINavigationController(Rotation_IOS6)
-(BOOL)shouldAutorotate
{
return [[self.viewControllers lastObject] shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations
{
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}
@end
Я также создал подкласс UIViewController, который действует как суперкласс для всех классов. Вот методы ориентации для суперкласса.
@implementation ParentViewController
- (BOOL)shouldAutorotate{
return NO;
}
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
return UIInterfaceOrientationPortrait;
}
@end
И контроллер методов ориентации, который поддерживает ландшафт, как показано ниже.
@implementation LandscapeController
#pragma mark -
#pragma mark Orientation Methods
- (BOOL)shouldAutorotate{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait|UIInterfaceOrientationMaskLandscape;
}
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
return (toInterfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
@end
Заранее спасибо.
2 ответа
Вот метод, чтобы нажать view.take переключателя объекта
На switch.m
+ (void)loadController:(UIViewController*)VControllerToLoad andRelease:(UIViewController*)VControllerToRelease
{
VControllerToLoad.navigationController.navigationBar.frame=CGRectMake(0, 0, 568, 44);
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect windowFrame = [[UIScreen mainScreen] bounds];
CGRect firstViewFrame = CGRectMake(statusBarFrame.origin.x, statusBarFrame.size.height, windowFrame.size.width, windowFrame.size.height - statusBarFrame.size.height);
VControllerToLoad.view.frame = firstViewFrame;
//check version and go
if (IOS_OLDER_THAN_6)
{
[((AppDelegate*)[UIApplication sharedApplication].delegate).window addSubview:VControllerToLoad.view];
}
else
{
[((AppDelegate*)[UIApplication sharedApplication].delegate).window setRootViewController:VControllerToLoad];
}
[VControllerToRelease.view removeFromSuperview];
}
Вы можете перейти в портретный режим из ландшафтного режима, как это, используя метод выше
PortraitViewController *portraitVC=[[PortraitViewController alloc]initWithNibName:@"PortraitViewController" bundle:nil];
[Switch loadController:portraitVC andRelease:self];
На ландшафтном представлении controller.m
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationController.title=@"Landscape";
appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.navigationController.navigationBarHidden = NO;
if (IOS_OLDER_THAN_6)
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO];
// Do any additional setup after loading the view from its nib.
}
#ifdef IOS_NEWER_OR_EQUAL_TO_6
-(BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft;
}
#endif
У меня была похожая проблема. В моем случае этот самый один контроллер вида должен был постоянно отображаться в альбомной ориентации, а на обратном пути другие контроллеры вида должны быть возвращены в портретный режим.
Я нашел следующее решение в FAQ: iPhone Landscape FAQ и решения
Ключевым моментом этой идеи является то, что устройство можно принудительно установить в определенную ориентацию только одним способом: 1. Установите ориентацию панели состояния. 2. Представьте любой контроллер вида модально (!), Который поддерживает целевую ориентацию.
Ну не хотите ли вы представить что-либо модально? Не волнуйтесь. Ничто не мешает вам... 3. мгновенно отклонить тот самый контроллер представления, как только он был представлен. Он даже не будет виден пользователю, когда вы сделаете это таким образом. Но как только это будет сделано, ваше устройство останется в этой самой ориентации. 4. Нажмите контроллер представления, который вы хотите отобразить, или даже перейдите к нему в случае, если вы используете раскадровки.
Мне показалось, что это единственное реальное решение. В дополнение к этому ответу в FAQ все остальное тоже должно быть настроено правильно. Поддерживаемые ориентации устройства для всего проекта должны быть в основном все. Поддерживаемые ориентации для каждого контроллера представления должны быть такими, которые поддерживает каждый контроллер представления и shouldAutoRotate
должен вернуться YES
, Это становится сложнее, если задействован контроллер панели вкладок. Обратитесь ко мне, если ваше приложение основано на панели вкладок.