2015-09-12 4 views
4

У меня есть простое приложение, состоящее из одного контроллера вида. Я начал с шаблоном GM Single View Application Xcode 7, но затем удаляется основной раскадровку, и настроить мой вид контроллера, как это:shouldAutorotate не вызван на контроллер вида

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    let vc = ViewController() 

    window = UIWindow(frame: UIScreen.mainScreen().bounds) 
    window!.rootViewController = vc 
    window!.makeKeyAndVisible() 

    return true 
} 

В моей информации PLIST, я все ориентации, указанные в поддержке интерфейса Ориентации, и приложение поворачивается во все ориентации на iPad.

Тем не менее, в моем простом контроллере вида¹ методы shouldAutorotate() и supportedInterfaceOrientations() не вызываются. Это проблема, потому что я экспериментирую с управлением пользовательским интерфейсом, позволяющим и отключая автоматическое вращение. Что может мешать этим методам?

Пример проект here (требуется Swift 2)


¹non- UINavigationController

ответ

5

Согласно этому сообщению на форуме Apple, Developer, если у вас есть IPad многозадачность включена (новая в прошивке 9), вам больше не может контролировать ориентацию вы поддерживаете:

https://forums.developer.apple.com/message/13508#13508

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

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

Также обратите внимание, что выполнение автоматического поворота на self.navigationController.view.superview.superview, вероятно, не самый лучший способ и может сломаться в какой-то момент в будущем. Вероятнее всего, лучший способ получить правильное представление, используемое для противодействия вращению. Очевидно, что если вы не используете навигационный контроллер, вам нужно будет перейти в другое представление. YMMV.

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
    self.startingInterfaceOrientation = [[UIApplication sharedApplication] statusBarOrientation]; 
} 

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
    [self updateLayoutsForCurrentOrientation:toInterfaceOrientation view:self.navigationController.view.superview.superview]; 
} 

- (void)updateLayoutsForCurrentOrientation:(UIInterfaceOrientation)toInterfaceOrientation view:(UIView *)view { 
    CGAffineTransform transform = CGAffineTransformIdentity; 

    if (self.startingInterfaceOrientation == UIInterfaceOrientationPortrait) { 
     switch (toInterfaceOrientation) { 
      case UIInterfaceOrientationLandscapeLeft: 
       transform = CGAffineTransformMakeRotation(M_PI/2.0f); 
       break; 
      case UIInterfaceOrientationLandscapeRight: 
       transform = CGAffineTransformMakeRotation(-M_PI/2.0f); 
       break; 
      case UIInterfaceOrientationPortrait: 
       transform = CGAffineTransformIdentity; 
       break; 
      case UIInterfaceOrientationPortraitUpsideDown: 
       transform = CGAffineTransformMakeRotation(M_PI); 
       break; 
      default: 
       break; 
     } 
    } 
    else if (self.startingInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { 
     switch (toInterfaceOrientation) { 
      case UIInterfaceOrientationLandscapeLeft: 
       transform = CGAffineTransformMakeRotation(-M_PI/2.0f); 
       break; 
      case UIInterfaceOrientationLandscapeRight: 
       transform = CGAffineTransformMakeRotation(M_PI/2.0f); 
       break; 
      case UIInterfaceOrientationPortrait: 
       transform = CGAffineTransformMakeRotation(M_PI); 
       break; 
      case UIInterfaceOrientationPortraitUpsideDown: 
       transform = CGAffineTransformIdentity; 
       break; 
      default: 
       break; 
     } 
    } 
    else if (self.startingInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) { 
     switch (toInterfaceOrientation) { 
      case UIInterfaceOrientationLandscapeLeft: 
       transform = CGAffineTransformIdentity; 
       break; 
      case UIInterfaceOrientationLandscapeRight: 
       transform = CGAffineTransformMakeRotation(M_PI); 
       break; 
      case UIInterfaceOrientationPortrait: 
       transform = CGAffineTransformMakeRotation(-M_PI/2.0f); 
       break; 
      case UIInterfaceOrientationPortraitUpsideDown: 
       transform = CGAffineTransformMakeRotation(M_PI/2.0f); 
       break; 
      default: 
       break; 
     } 
    } 
    else if (self.startingInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
     switch (toInterfaceOrientation) { 
      case UIInterfaceOrientationLandscapeLeft: 
       transform = CGAffineTransformMakeRotation(M_PI); 
       break; 
      case UIInterfaceOrientationLandscapeRight: 
       transform = CGAffineTransformIdentity; 
       break; 
      case UIInterfaceOrientationPortrait: 
       transform = CGAffineTransformMakeRotation(M_PI/2.0f); 
       break; 
      case UIInterfaceOrientationPortraitUpsideDown: 
       transform = CGAffineTransformMakeRotation(-M_PI/2.0f); 
       break; 
      default: 
       break; 
     } 
    } 
    view.transform = transform; 
} 

Большая часть этого кода была заимствована из JTSImageViewController Джаред Синклера (отправил с его разрешения), доступно в соответствии с лицензией MIT на GitHub здесь: https://github.com/jaredsinclair/JTSImageViewController

+0

Спасибо. Я действительно смогу помочь вам с поворотом вашего угла. В '-viewWillTransitionToSize: withTransitionCoordinator:', call '[UIView setAnimationsEnabled: NO];', затем '[coordinator animateAlongsideTransition: nil completion: ...', и в вашем завершении вызовите '[UIView setAnimationsEnabled: YES];' –

+0

Благодарю. Мне нравится, как документация Apple похожа на ∞ – SpaceDog

0

Я просто попытался решения в этой теме: https://stackoverflow.com/a/32782517/1679627

Обратите внимание, что в файле info.plist есть две записи для поддерживаемых ориентаций на iPhone и один для iPad.

0

Чтобы отказаться от участия в просмотре слайдов и сплитов, добавьте ключ UIRequiresFullScreen в файл Info.plist проекта Xcode и примените логическое значение YES.

Смежные вопросы