2013-07-23 2 views
2

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

После того, как фотография сделана/выбрана, она передается в UIImageView на следующем VC.

Я бы хотел показать этот контроллер View, ТОЛЬКО в Ориентации, что изображение находится в. Поэтому, если пользователь берет фотографию в левом левом углу (после выбора «Использовать»), следующий контроллер просмотра должен загрузиться в «Пейзаж слева» с помощью этого изображения в поле «UIImageView». Если они берут изображение в портрете, диспетчер просмотра загружается в портрет. Как только VC загрузится в правильной ориентации, он не должен двигаться (вращаться больше).

Это то, что я пытался до сих пор, но не может заставить его работать так, как я ожидал:

#pragma mark - 
#pragma mark - Auto Rotation Overrides 
- (BOOL)shouldAutorotate { 
    if (self.photoImage != NULL) { 
     // Check that photoImage has an image 
     if (self.photoImage.imageOrientation == 1 || self.photoImage.imageOrientation == 0) { 
      // Landscape left = 0, Landscape rigt = 1 
      return YES; 
     } else { 
      // Portrait normal = 3, portait upside down = 2 
      return NO; 
     } 
    } 

    // Fallback to portrait 
    return NO; 
} 

-(NSUInteger)supportedInterfaceOrientations { 
    if (self.photoImage != NULL) { 
     // Check that photoImage has an image 
     if (self.photoImage.imageOrientation == 0) { 
      return UIInterfaceOrientationMaskLandscapeLeft; 
     } else if (self.photoImage.imageOrientation == 1) { 
      return UIInterfaceOrientationMaskLandscapeRight; 
     } else { 
      return UIInterfaceOrientationMaskPortrait; 
     } 
    } 

    // Fallback to Portrait 
    return UIInterfaceOrientationMaskPortrait; 
} 


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { 
    if (self.photoImage != NULL) { 
     // Check that photoImage has an image 
     if (self.photoImage.imageOrientation == 0) { 
      return UIInterfaceOrientationLandscapeLeft; 
     } else if (self.photoImage.imageOrientation == 1) { 
      return UIInterfaceOrientationLandscapeRight; 
     } else { 
      return UIInterfaceOrientationPortrait; 
     } 
    } 

    // Fallback to Portrait 
    return UIInterfaceOrientationPortrait; 
} 

----- EDIT -----

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

----- ----- EDIT2

ли preferredInterfaceOrientationForPresentation работа в iOS6 тоже? Я могу настроить подклассу навигационного контроллера, чтобы посмотреть на self.topViewControllers preferredInterfaceOrientationForPresentation, однако это, по-видимому, означает, что для каждого метода topViewController должен быть этот метод. В идеале я хочу настроить подкласс, чтобы сказать: , если topViewController имеет ответ на preferredInterfaceOrientationForPresentation, а затем используйте этот портрет/по умолчанию. Это можно сделать?

Если это так, я могу обновить preferredInterfaceOrientationForPresentation, который будет загружать этот VC в правильной ориентации, тогда shouldAutoRotate будет контролировать его, не поворачивая обратно в другую ориентацию?

ответ

0

Из того, что я понимаю, нет никакого способа заставить событие поворота, поэтому вам нужно придумать какой-нибудь трюки. Я сделал поиск Google для «заставить UIView вращаться» и нашел некоторые ссылки, которые могут помочь:

Removing and re-adding the view from the window

Rotating the view with a transform

Лично я хотел бы попробовать превратить первый, здесь соответствующий код:

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:YES]; 
self.view.transform = CGAffineTransformIdentity; 
self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); 
self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0); 

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

+0

Спасибо, да, я использую панель навигации. Я предполагаю, что это должно применяться в viewDidAppear на основе инструкции if для ориентации изображения, которую у меня есть. – StuartM

+0

viewWillAppear, viewDidLoad или viewDidAppear должны работать в зависимости от вашей ситуации. – JonahGabriel

+0

Спасибо, что он повернул представления, но не панель Nav, как вы думали ... так что это не решение на данный момент. Моя вторая мысль заключалась бы в том, чтобы заставить метод prefferredInterface работать таким образом, чтобы он отображался в правильном интерфейсе, и shouldAutoRotate перестанет вращаться снова ...? Я отредактировал вопрос с обновлением – StuartM

0

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

if(sourceImage.size.width>sourceImage.size.height) 
    { 
     LandscapeViewController *LandscapeView = [[LandscapeViewController] init]; 
     [self presentViewController:LandscapeView animated:YES completion:nil]; 
     NSLog(@"go to Landscape View"); 
    } 
    //Else load into portrait Edit view 
    else 
    { 
     PortraitViewController *PortraitView = [[PortraitViewController alloc] init]; 
     [self presentViewController:PortraitView animated:YES completion:nil]; 
     NSLog(@"go to Portrait View"); 
    } 

Я уверен, что есть более эффективные способы, но это невероятно просто и работает!

+0

Это не работает для меня. В моей раскадровке я создал два отдельных VC, один из которых - Пейзаж и другой порт. Но представление всегда загружается сначала в Portrait. Что-то еще нужно? – StuartM

0

С iOS 6 это навигационный контроллер, который обрабатывает ориентацию. Как вы думали, вы можете подклассифицировать его и проверить, нужен ли диспетчеру topview с помощью respondsToSelector:.

- (NSUInteger)supportedInterfaceOrientations { 
     if([self.topViewController respondsToSelector:@selector(supportedInterfaceOrientations)]){ 
      return [self.topViewController supportedInterfaceOrientations]; 
     } 
    return [super supportedInterfaceOrientations]; 
} 

Мне нужно было заставить пейзаж. Я также добавил в диспетчерское viewDidLoad:

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO]; 

Вы должны изменить ориентацию на тот, который вы хотите.