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

Заранее спасибо.


person kkumpavat    schedule 15.02.2013    source источник
comment
У меня есть один образец, который может быть вам полезен. Отправьте свой адрес электронной почты, я вышлю вам его.   -  person Vidhyanand    schedule 15.02.2013
comment
Спасибо Видьянанд за ответ. Вот мой адрес электронной почты: [email protected]   -  person kkumpavat    schedule 15.02.2013
comment
В моем примере первый вид — портретный, второй — альбомный, а третий — снова портретный. Удалите адрес электронной почты.   -  person Vidhyanand    schedule 15.02.2013


Ответы (2)


Вот метод, чтобы нажать view.take переключатель объекта

На выкл.м

+ (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
person Vidhyanand    schedule 15.02.2013

У меня была похожая проблема. В моем случае этот самый контроллер представления должен был все время отображаться в альбомной ориентации, а на обратном пути другие контроллеры представления должны быть снова установлены в портретную ориентацию.

Я нашел следующее решение в FAQ: Часто задаваемые вопросы и решения для iPhone в альбомной ориентации

Ключевым моментом этой идеи является то, что устройство можно заставить принять определенную ориентацию только одним способом: 1. Установить ориентацию панели состояния. 2. Модально представить любой контроллер представления (!), который поддерживает целевую ориентацию.

Ну что, модально ничего представить не хотите? Не переживай. Ничто не мешает вам... 3. мгновенно закрыть тот самый контроллер представления, как только он будет представлен. Это даже не будет видно пользователю, когда вы сделаете это таким образом. Но как только это будет сделано, ваше устройство останется именно в этой ориентации. 4. Нажмите на контроллер представления, который вы хотите отобразить, или даже перейдите к нему, если вы используете раскадровки.

Мне это казалось единственным рабочим решением. В дополнение к этому ответу в FAQ все остальное тоже должно быть правильно установлено. Поддерживаемые ориентации устройства для всего проекта должны быть в основном все. Поддерживаемые ориентации для каждого контроллера представления должны быть теми, которые поддерживает каждый контроллер представления, и shouldAutoRotate должно возвращать YES. Это становится сложнее, если задействован контроллер панели вкладок. Свяжитесь со мной, если ваше приложение основано на панели вкладок.

person Hermann Klecker    schedule 15.02.2013