Подтвердить что ты не робот

IOS 6 Вопрос о ротации - нет вращения из представленного контроллера Modal View

У меня есть MainViewController, у которого есть кнопка, которая подталкивает новое представление (InfoViewController), через flip horizontailly. так:

controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES];

Контроллер MainView поддерживает Portrait и PortraitUpsideDown. Например:

- (BOOL)shouldAutorotate {
    return YES;    
}

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

В моем InfoViewController также указан вышеуказанный код. В моем AppDelegate он имеет это в LaunchOptions:

[self.window setRootViewController:self.mainViewController];

В моем файле app.plist он поддерживает все ориентации. Это связано с тем, что другие представления также должны поддерживать ландшафт. Поэтому на моем MainViewController и InfoViewController мне нужны только Portrait и PortraitUpsideDown. Но, по другому мнению, мне нужны все orintations.

My MainViewController отлично работает, но мой InfoViewController работает для всех ориентаций.

Я испытываю крайность, пытаясь заставить это работать в iOS6. Я исследовал другие должности и пытался помочь другим людям, но не повезло. Пожалуйста, может кто-то помочь мне получить это спасибо. И я новичок Objective-C: p

4b9b3361

Ответ 1

Не поддерживайте все ориентации в файле plist приложения, только те, которые поддерживает ваш корневой контроллер.

Авторизация изменяется в iOS 6. В iOS 6 метод shouldAutorotateToInterfaceOrientation: UIViewController устарел. Вместо этого вы должны использовать методы supportedInterfaceOrientationsForWindow: и shouldAutorotate:

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAllButUpsideDown;    
}

Modal ViewControllers больше не получают вызовы вращения в iOS 6: willRotateToInterfaceOrientation:duration:, willAnimateRotationToInterfaceOrientation:duration:, и didRotateFromInterfaceOrientation: методы больше не вызываются ни в одном контроллере представления, что делает полноэкранную презентацию (например, те, которые вызываются с помощью: presentViewController:animated:completion:.

Вы можете позволить контроллеру представления, который представляет ваш контроллер модального представления, сообщить ему о ротации. Кроме того, теперь вы используете: presentViewController:animated:completion: для представления контроллера вида. presentModalViewController:animated: устарел, который вы используете в коде.

Ответ 2

Я решил подобные проблемы, используя контроллер панели вкладок.

Подкласс UITabBarController. Выполните следующие методы:

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}


- (BOOL)shouldAutorotate
{
    NSLog(@"Orientation:%d", [[UIDevice currentDevice] orientation]);

    for (UIViewController *viewController in self.viewControllers) {
        [viewController shouldAutorotate];
    }

    return YES;
}

Если вы хотите обрабатывать вращения в контроллерах внутри tabbarcontroller, в каждом из контроллеров в панели управления таблицами также реализуются эти методы и записываются код для изменения ориентации. Если вы не хотите его обрабатывать, вам не нужно реализовывать эти методы. Методы TabBarControllers всегда будут выполняться при изменении ориентации. Даже дважды по неизвестной причине.

Да, и не забудьте удалить все методы toAutorotate. Я полностью перешел на новую модель ориентации. Если вы хотите, чтобы они остались, возможно, это будет сложнее.

Ответ 3

Создайте категорию путем подклассификации UINavigationController и выполните следующие методы   в .h файле

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



 in .m file

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

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

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

и реализовать следующие методы в классе контроллера представления, класс u хочет включить ротацию

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


- (BOOL)shouldAutorotate
{
return YES;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
   return UIInterfaceOrientationLandscapeLeft;
}

Ответ 4

добавить этот код в подкласс UITabBarController.m

@implementation UINavigationController (rotation)
//temp hack for iOS6, this allows passing supportedInterfaceOrientations to child viewcontrollers.
- (NSUInteger)supportedInterfaceOrientations {
    return [self.topViewController supportedInterfaceOrientations];
}
@end

@implementation NameClassUITabBar

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscape;
}

@end

Здесь я разместил свое решение /experince в контроллере панели с поворотами: http://luterr.blogspot.sg/2015/04/example-code-uiinterfaceorientationmask.html