ориентация интерфейса iOS6 нарушена


Просто пришлось обновить приложение iOS 5 до iOS 6 и, конечно, наткнулся на проблемы ориентации интерфейса. Теперь я уже знаю, что все изменилось, и даже знаю, что изменилось, но все равно не могу справиться с этим самостоятельно.

Мое приложение состоит из нескольких viewcontrollers, которые помещаются на navigationcontroller. Все видоуправители должны быть в альбомной ориентации, за исключением одного, который должен быть в книжной ориентации. В iOS 5 все работало нормально, но теперь одна контроллер в портретном режиме также отображается в альбомном режиме и, конечно, искажается.

Мой код iOS 5 выглядел так:

Viewcontroller в ландшафтном режиме:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
return (interfaceOrientation==UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation==UIInterfaceOrientationLandscapeRight);
}

Viewcontroller в портретном режиме:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
return (interfaceOrientation==UIInterfaceOrientationPortrait) || (interfaceOrientation==UIInterfaceOrientationPortraitUpsideDown);
}

Теперь, когда я узнал об изменениях в iOS 6, я реализовал

AppDelegate: (допускает все ориентации, как в plist)

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
return UIInterfaceOrientationMaskLandscapeLeft|UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}

Viewcontroller в ландшафтном режиме: (ограничение ориентации на ландшафт режим)

- (NSUInteger) supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight
}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

- (BOOL)shouldAutorotate{ 
return YES;
}  

Viewcontroller в портретном режиме: (ограничение ориентации в портретном режиме)

- (NSUInteger) supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { 
return UIInterfaceOrientationPortrait | UIInterfaceOrientationPortraitUpsideDown;
}

- (BOOL)shouldAutorotate { 
return YES;
}
Насколько я понимаю, это должно сработать, но правда в том, что это работает еще меньше, чем раньше. Во-первых, видоуправители ландшафтного режима не остаются в ландшафтном режиме, они свободно вращаются во всех направлениях, это, конечно, не то, что я хотел. Во-вторых, viewcontroller в портретном режиме завершит работу с
Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason: 'preferredInterfaceOrientationForPresentation must return a supported interface orientation!'

После некоторых проб и ошибок я только, кажется, могу заблокировать все контроллеры в ландшафтный режим, через файл plist / appdelegate, что, конечно, заставляет контроллер портретного режима также переключаться в ландшафтный режим. С другой стороны, я могу управлять тем, чтобы контроллер портретного режима был в правильной ориентации, но это также повернет контроллеры ландшафтного режима в портретный режим. Кажется, я не могу заставить работать обоих.

Есть идеи?

2 4

2 ответа:

Хорошо, я исправил это.

Я сделал категорию для UINavigationController

@implementation UINavigationController (Rotation_IOS6)

-(BOOL)shouldAutorotate
{
return [self.topViewController shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
return [self.topViewController supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return [self.topViewController preferredInterfaceOrientationForPresentation];
}

@end

Для пересылки значений контроллеров вида в navigationcontroller...

Мне также пришлось заменить presentModalViewController на presentViewController, так как первый теперь устарел.

Кстати, да там как опечатка в моем appdelegate...это правильно.

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskLandscapeLeft|UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortrait|UIInterfaceOrientationMaskPortraitUpsideDown;
}

Только что заметил, что в вашем UIInterfaceOrientationMaskLandscapeleft написано дважды в appdelegate LandscapeRight отсутствует Если это просто опечатка и все еще сталкивается с проблемой после исправления

Я нашел только rootViewControllers - (BOOL) shouldAutorotate; get called. Здесь ur rootViewController-это NavigationController. И для pushed viewController это не называется так u hav, чтобы решить поддержку ориентации для pushed view только из методов navControllers. Следование работало на меня для моего navControllers толкнул viewController
Переопределение методов UINavigationControllers

- (BOOL)shouldAutorotate;
- (NSUInteger) supportedInterfaceOrientations;

Код будет примерно таким для u

@implementaion UINavigationController(Rotation)

- (BOOL)shouldAutorotate
{
return YES;
}

- (NSUInteger) supportedInterfaceOrientations
{
    NSArray *viewsArray = [self viewController]//stack of pushed controller

    NSUInteger orientationToReturn = assignAllMask;

    for(UIViewController *temp in  viewsArray)
    {
        if([temp isKindOfClass:MyOnlyLandscapeViewController] == YES )
        {
            orientationToReturn = assignLandscapeMask;
            break;
        }
        else if([temp isKindOfClass:MyOnlyPortraitViewController] == YES )
        {
            orientationToReturn = assignPortraitMask;
            break;
        }
    }

    return orientationToReturn;
}

@end