2013-04-08 3 views
7

Привет Я пытаюсь воспроизвести тот же поворот, который можно увидеть в приложении для камеры, когда ориентация смещена в альбомную. К сожалению, мне не повезло. Мне нужно настроить это для пользовательского CameraOverlayView с UIImagePickerController.Репликация вращения приложения для камеры в ландшафт IOS 6 iPhone

С этого портрета (B являются UIButtons)

|-----------| 
|   | 
|   | 
|   | 
|   | 
|   |  
|   | 
| B B B | 
|-----------| 

Для этого пейзажа

|----------------| 
|    B | 
|    | 
|    B | 
|    | 
|    B | 
|----------------| 

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

+0

задал тот же вопрос некоторое время назад - http://stackoverflow.com/questions/15377120/uiimagepickercontroller-record-video-with-landscape-orientation, к сожалению, до сих пор нет хорошего ответа. –

+0

Ну, я пробормотал с помощью Autolayout Constraints в xcode, но они явно специфичны для привязки элементов к текущему дну ориентации, а не к дну оригинального портрета. Следующей попыткой я попытаюсь установить противопоказания во время выполнения с помощью команды '- (void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) toInterfaceOrientation duration: (NSTimeInterval) duration' Есть ли у вас какие-либо предложения, хотя @Aaron? – pechar

ответ

15

ОК, поэтому мне удалось разобраться в этом. Следует отметить, что класс UIImagePickerController поддерживает портретный режим только в соответствии с Apple documentation.

Для захвата вращения willRotateToInterfaceOrientation здесь бесполезен, поэтому вам необходимо использовать notificatons. Кроме того, установка ограничений автоопределения во время выполнения - это не путь.

В AppDelegate didFinishLaunchingWithOptions вам нужно с поддержкой уведомлений вращения:

// send notification on rotation 
[[UIDevice currentDevice]beginGeneratingDeviceOrientationNotifications]; 

В viewDidLoad способе cameraOverlayView UIViewController добавить следующее:

//add observer for the rotation notification 
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil]; 

Наконец, добавьте метод orientationChanged: к cameraOverlay UIViewController

- (void)orientationChanged:(NSNotification *)notification 
{ 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 
    double rotation = 0; 

    switch (orientation) { 
     case UIDeviceOrientationPortrait: 
      rotation = 0; 
      break; 
     case UIDeviceOrientationPortraitUpsideDown: 
      rotation = M_PI; 
      break; 
     case UIDeviceOrientationLandscapeLeft: 
      rotation = M_PI_2; 
      break; 
     case UIDeviceOrientationLandscapeRight: 
      rotation = -M_PI_2; 
      break; 
     case UIDeviceOrientationFaceDown: 
     case UIDeviceOrientationFaceUp: 
     case UIDeviceOrientationUnknown: 
     default: 
      return; 
    } 
    CGAffineTransform transform = CGAffineTransformMakeRotation(rotation); 
    [UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
     self.btnCancel.transform = transform; 
     self.btnSnap.transform = transform;  
    }completion:nil]; 
} 

В приведенном выше коде применяется преобразование вращения на 2 UIButtons, которые я использую в этом случае btnCancel и btnSnap. Это дает вам эффект приложения «Камера» при вращении устройства. Я все еще получаю предупреждение в консоли <Error>: CGAffineTransformInvert: singular matrix. не знаю, почему это происходит, но это как-то связано с видом камеры.

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

+0

Спасибо. Это действительно помогло мне. – Zigglzworth

+0

Рад, что это было полезно! – pechar

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