2

Я не хочу, чтобы мое приложение было ландшафтным и всегда было porttrait.Так я сделал свое приложение Информация о развертывании, чтобы установить только портрет. но когда мне нужно отображать любое изображение или видео в моем приложении, мне нужен ландшафтный режим для лучшего отображения.Как вручную настроить ориентацию устройства, когда портрет информации о развертывании приложения заблокирован?

можно обнаружить изменение ориентации устройства по

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(orientationChanged:) 
name:UIDeviceOrientationDidChangeNotification 
object:[UIDevice currentDevice]]; 

- (void) orientationChanged:(NSNotification *)note 
{ 
UIDevice * device = note.object; 
switch(device.orientation) 
{ 
    case UIDeviceOrientationPortrait: 
     /* */ 
     break; 

    case UIDeviceOrientationPortraitUpsideDown: 
     /* */ 
     break; 
    case UIDeviceOrientationLandscapeLeft: 
     /* */ 
     break; 

    case UIDeviceOrientationLandscapeRight: 
     /* */ 
     break; 
    default: 
     break; 
}; 
} 

Но как я вручную изменить ориентацию устройства, даже когда приложение Info Deployment портрет заблокирован?

Это оленья кожа работал

NSNumber *value=[NSNumber numberWithInt: UIDeviceOrientationLandscapeLeft]; 
[[UIDevice currentDevice] setValue:value forKey:@"orientation"]; 

ответ

4

Включите портрет & Пейзаж с вашего проекта. Затем используйте ниже метод для всех ViewController к авторотации выключить -

- (BOOL)shouldAutorotate { 
    return NO; 
} 

Затем используйте ниже метод для всех, кроме LandScapeViewControler -

- (void)viewWillAppear:(BOOL)animated { 

    [[UIDevice currentDevice] setValue: 
    [NSNumber numberWithInteger: UIInterfaceOrientationPortrait] 
           forKey:@"orientation"]; 
} 

Использование ниже метода LandScapeViewControler -

- (void)viewWillAppear:(BOOL)animated { 

     [[UIDevice currentDevice] setValue: 
     [NSNumber numberWithInteger: UIInterfaceOrientationLandscapeLeft] 
            forKey:@"orientation"]; 
    } 

Если вы используйте NavigationController и TabBarController, затем используйте категорию, чтобы отключить авторотацию.

Надеюсь, это поможет вам.

+0

зачем нужен этот метод ** LandScapeViewControler --- (void) viewWillAppear: (BOOL) анимированный **? Не могу я просто поставить shouldAutorotate на ** ДА ** в ** LandScapeViewControler **, и он может вращаться в LandScapeleft, справа, портрет, upsidedown. –

+0

Вы хотите ограничить только LandScapeViewControler в LandScape. В противном случае вы можете вернуть ДА –

+2

, к сожалению, мой ** shouldAutorotate ** не вызывается. Вы знаете почему? –

6

два этапа:

  1. Include пейзаж с развертыванием
  2. В каждом контроллере представления viewDidLoad вам необходимо включить:

    //Swift 
    let value = UIInterfaceOrientation.LandscapeLeft.rawValue 
    UIDevice.currentDevice().setValue(value, forKey: "orientation") 
    
    //Obj-C 
    NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft]; 
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"]; 
    

Смотрите также: How do I programmatically set device orientation in iOS7?

+0

Мне не нужно пейзаж для моего приложения, за исключением фотографий и видео. Включение «ландшафта в развертывание» не имеет смысла. –

+0

Если у вас есть сценарий, где вы делаете, вы не можете полностью его предотвратить. Предположительно, видео и изображения отображаются в контроллере вида, поэтому установите этот параметр в «Ландшафт» – Mika

+0

im, используя QLPreviewController для просмотра файлов, и вы отклонились от моего вопроса «Как установить ориентацию даже в режиме блокировки портрета в ** Информация о развертывании ** включена ** **? –

1

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

#import "RotationAwareNavigationController.h" 

@implementation RotationAwareNavigationController 

-(BOOL)shouldAutorotate { 
    return NO; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return UIInterfaceOrientationLandscapeRight; 
} 

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskLandscape; 
} 

Вы должны называть его, как показано ниже;

RotationAwareNavigationController *navController = [[RotationAwareNavigationController alloc] initWithRootViewController:aViewController]; 
[self presentViewController:navController animated:NO completion:nil]; 
0

Обновленный ответ для Swift 3+:

+0

В основном работает, но получил несколько (2) сбоев при этом во время тестирования. Думаю, не большая проблема; но все же это, очевидно, «недокументированная» функция, и ее следует рассматривать как таковую. Я буду искать другой путь. – Jonny

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