0

У меня есть представление, которое загружается в любой ориентации пользовательского интерфейса. У меня есть требование разрешить пользователям выбирать и блокировать желаемую ориентацию. Ниже приведено изображение моего тестового приложения. Я хочу программно изменить ориентацию вида на UIInterfaceOrientationLandscapeLeft, когда выбран Left.UIView вращение ориентации ПОСЛЕ того, как он отображается

Я знаю, как его заблокировать. У меня просто возникают проблемы с поворотом представления, как будто физическое вращение устройства.

enter image description here

Вот мой код:

- (void)rotateView:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    self.interfaceOrientation = toInterfaceOrientation; 
    CGFloat rotationFactor = 0; 
    CGRect frame; 
    switch (toInterfaceOrientation) { 
     case UIInterfaceOrientationPortrait: 
      frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height); 
      rotationFactor = M_PI; 
      break; 
     case UIInterfaceOrientationLandscapeRight: 
      frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.height, self.view.frame.size.width); 
      rotationFactor = M_PI_2; 
      break; 
     case UIInterfaceOrientationLandscapeLeft: 
      frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.height, self.view.frame.size.width); 
      rotationFactor = 3 * M_PI_2; 
      break; 

     default: 
      break; 
    } 
    // check current orientation 
    if ([[UIApplication sharedApplication] statusBarOrientation] != toInterfaceOrientation) { 
     self.orientationLocked = NO; 
//  [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
//  [[UIApplication sharedApplication] setStatusBarOrientation:toInterfaceOrientation]; 
//  [[UIApplication sharedApplication] setStatusBarHidden:NO]; 
     // no, the orientation is wrong, we must rotate the UI 
     self.navigationController.view.userInteractionEnabled = NO; 
     [UIView beginAnimations:@"rotateView" context:NULL]; 
     [UIView setAnimationDelegate:self]; 
     // setup status bar 
     [[UIApplication sharedApplication] setStatusBarOrientation:toInterfaceOrientation animated:NO]; 
     // rotate main view, in this sample the view of navigation controller is the root view in main window 
     [self.navigationController.view setTransform: CGAffineTransformMakeRotation(3 * M_PI_2)]; 
     // set size of view 
     [self.navigationController.view setFrame:frame]; 
     [UIView commitAnimations]; 
     self.orientationLocked = YES; 
    } 
} 

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

Единственная проблема, из-за которой эти рекомендации могут не работать, может быть вызвана тем, что это представление является представлением корневого представления. Может ли кто-нибудь помочь мне программно повернуть это представление от портрета к любой ориентации ландшафта?

ответ

1

@Shan - Я использовал ваш код для поворота строки состояния и добавил вызов следующего метода для поворота Посмотреть. Оно работает!!!! Таким образом, ты получил меня на полпути. Вот остальная часть кода:

#define ROTATE_90 M_PI_2 
#define ROTATE_180 M_PI 
#define ROTATE_270 M_PI + M_PI_2 

/** 
* Rotates and resizes the view 
*/ 
- (void)rotateToSelectedOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    CGRect viewRect = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height); 
    switch (toInterfaceOrientation) { 
     case UIInterfaceOrientationLandscapeLeft: 
      self.view.transform = CGAffineTransformMakeRotation(ROTATE_270); 
      break; 

     case UIInterfaceOrientationLandscapeRight: 
      self.view.transform = CGAffineTransformMakeRotation(ROTATE_90); 
      break; 

     case UIInterfaceOrientationPortrait: 
      self.view.transform = CGAffineTransformMakeRotation(0); 
      break; 

     case UIInterfaceOrientationPortraitUpsideDown: 
      break; 

     default: 
      self.view.transform = CGAffineTransformMakeRotation(0.0); 
      break; 
    } 
    if (UIInterfaceOrientationIsLandscape(self.currentOrientation) && UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) { 
     viewRect = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height); 
    } else { 
     viewRect = CGRectMake(0,0,self.view.frame.size.height,self.view.frame.size.width); 
    } 
    self.view.frame = viewRect; 
    self.currentOrientation = toInterfaceOrientation; 
} 
+0

Я думал, что речь идет о «когда», «не» как ». –

1

Хмм хорошо попробовать ниже код в новом проекте я вывешиваю весь код, это может у нужно, надеюсь, это поможет U .. :)

попробовать это в новом проекте


#import "AnyOrientationViewController.h" 

@interface AnyOrientationViewController() 
{ 

} 

@end 

@implementation AnyOrientationViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
    // Custom initialization 
    } 
return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Do any additional setup after loading the view from its nib. 
    self.segmentControle.selectedSegmentIndex = 0; 
    [self.segmentControle addTarget:self action:@selector(valueChange:) forControlEvents:UIControlEventValueChanged]; 
} 


- (BOOL)shouldAutorotate 
{ 
    return NO; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 

    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight; 

} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 

    return UIDeviceOrientationPortrait | UIDeviceOrientationLandscapeLeft | UIDeviceOrientationLandscapeRight; 


} 

- (void)valueChange:(UISegmentedControl *)sender 
{ 

    //hear is the code to change the orientation 
    int index = sender.selectedSegmentIndex; 
    switch (index) { 
    case 0: 
     NSLog(@"all orientation"); 

     // [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait; 
     [UIApplication sharedApplication].statusBarOrientation = [[UIDevice currentDevice] orientation]; 
     break; 
    case 1: 

     if([[UIApplication sharedApplication] statusBarOrientation] != UIInterfaceOrientationPortrait) 
     { 
      [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait; 
     } 
     break; 
    case 2: 

     if([[UIApplication sharedApplication] statusBarOrientation] != UIInterfaceOrientationLandscapeLeft) 
     { 
      [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeLeft; 
     } 

     break; 
    case 3: 

     if([[UIApplication sharedApplication] statusBarOrientation] != UIInterfaceOrientationLandscapeRight) 
     { 
      [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeRight; 
     } 
     break; 

    default: 
     break; 
    } 
} 



- (void)didReceiveMemoryWarning 
    { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
    } 


+0

Благодарим вас за ответ. Я попробую этот код. После хорошего ночного сна я понял, что это корневой вид. Doh! :-) – Patricia

+0

Это не сработало в моем проекте, но оно действительно работало в совершенно новом проекте. Теперь мне нужно выяснить, как заставить его работать в моем проекте. Большое вам спасибо за вашу помощь. :-) – Patricia

+0

Извините, чувак, это вращает содержимое только в симуляторе, а не на самом устройстве. Что-то странное, хотя это то, что в симуляторе строка состояния всегда находится наверху, пока содержимое вращается, и на телефоне строка состояния вращается, пока содержимое не отображается. – Patricia

0

Если вы хотите, чтобы ваше приложение автоматически Orient данное видео, чтобы заполнить весь экран, независимо от соотношения сторон (широкий или высокий) и ориентации устройства (портрет или пейзаж) Попробуйте это:

  1. Регистрация для уведомления генерируется при изменении ориентации панели состояния:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotateDevice) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; 
    
  2. Добавить Тхи код с методом селектора объект уведомления в:

    - (void)didRotateDevice 
    { 
    CGFloat theta = 0.0; 
    switch ([UIApplication sharedApplication].statusBarOrientation) 
    { 
        case UIDeviceOrientationPortrait: 
         theta += -90.0; 
         CGAffineTransform transform = self.transform; 
         transform = CGAffineTransformRotate(transform, radians(theta)); 
         self.transform = transform; 
         break; 
        case UIDeviceOrientationLandscapeRight: 
         if (self.transform.a != 1.0) { 
          theta += 90.0; 
          transform = self.transform; 
          transform = CGAffineTransformRotate(transform, radians(theta)); 
          self.transform = transform; 
         } 
         break; 
        case UIDeviceOrientationLandscapeLeft: 
         if (self.transform.a != 1.0) { 
          theta += -90.0; 
          transform = self.transform; 
          transform = CGAffineTransformRotate(transform, radians(theta)); 
          self.transform = transform; 
         } 
         break; 
        default: 
         NSLog(@"default"); 
         break; 
    } 
    
    [self setFrame:[[UIScreen mainScreen] bounds]]; 
    } 
    

Приведенный выше код будет предотвратить только вид от вращения, когда ориентация устройства меняется; все другие виды будут вращаться, как ожидалось.