Проблемы с поворотом камеры - PullRequest
2 голосов
/ 07 ноября 2011

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

- (BOOL)shouldAutorotateToInterfaceOrientation
               (UIInterfaceOrientation)interfaceOrientation  {
        if (cameraIsOn) {
            return NO;
        }
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

Проблема : вид камеры по-прежнему поворачивается в портретный режим, когда я наклоняю камеру вПейзаж.Это приводит к тому, что устройство находится в альбомной ориентации, а вид в книжной ориентации, работает за пределами экрана.

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

- (void)cameraOrientationChanged  {
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
CGAffineTransform transform;
switch (orientation) {
    case UIDeviceOrientationPortrait:
        transform = CGAffineTransformIdentity;
        self.rotatePrompt.hidden = NO;
        break;
    case UIDeviceOrientationPortraitUpsideDown:
        //transform = CGAffineTransformMakeRotation(180*M_PI/180);
        transform = CGAffineTransformIdentity;
        self.rotatePrompt.hidden = NO;
        break;
    case UIDeviceOrientationLandscapeLeft:
        //transform = CGAffineTransformMakeRotation(90*M_PI/180);
        self.rotatePrompt.hidden = YES;
        transform = CGAffineTransformIdentity;
        break;
    case UIDeviceOrientationLandscapeRight:
        //transform = CGAffineTransformMakeRotation(-90.0*M_PI/180);
        transform = CGAffineTransformMakeRotation(180*M_PI/180);
        self.rotatePrompt.hidden = YES;
        break;
    default:
        transform = CGAffineTransformIdentity;
        break;
}
self.shootButton.transform = transform;
self.cameraTypeButton.transform = transform;
self.photoLibraryButton.transform = transform;
self.changeCameraDirectionButton.transform = transform;
self.flashButton.transform = transform;
self.videoTimerLabel.transform = transform;
self.closeCameraButton.transform = transform;

}

Примечание Казалось, что все работало нормально, прежде чем я обновился до iOS 5.

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

Еще более странно, когда бы это ни происходило (это не всегда происходит), я заметил, что shouldAutorotateToInderfaceOrientation не вызываетсяв контроллере вида.Могу поспорить, что это как-то связано с проблемой здесь.

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Проблема с настройкой моего контроллера навигации.UIImagePickerController отправляет сообщение о ротации методу shouldAutoRotateToInterface: для корневого контроллера.Однако, поскольку я скопировал класс из более старого проекта (iOS 3), у него не было автоматически скопированного метода shouldAutoRotateToInterface:Теперь, когда я написал метод в своем контроллере корневого представления, проблема с вращением исправлена.

0 голосов
/ 07 ноября 2011

Вы, кажется, используете UIDeviceOrientation, когда вы действительно должны использовать UIInterfaceOrientation.UIDeviceOrientation имеет гораздо больше состояний, чем UIInterfaceOrientation, так что это может привести к тому, что состояние устройства будет отличаться от того, что вы ожидали для состояния интерфейса, например, UIDeviceOrientationFaceUp может быть возвращено, даже если ориентация интерфейса (для пользователя) похоже, что это должно быть UIInterfaceOrienataionLandscape.Так что в вашем случае ваш default регистр переключателя может возвращаться чаще, чем вы ожидаете.

Если бы это был я, я бы изменил ваш - (void)cameraOrientationChanged метод на - (void)cameraOrientationChangedTo:(UIInterfaceOrientation)orientation и вызвал бы этометод в shouldAutorotateToInterfaceOrientation:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  {

    [self cameraOrientationChangeTo:interfaceOrientation];

    if (cameraIsOn) {
        return NO;
    }

    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

UIDeviceOrientation против UIInterfaceOrientation:

typedef enum {
   UIDeviceOrientationUnknown,
   UIDeviceOrientationPortrait,
   UIDeviceOrientationPortraitUpsideDown,
   UIDeviceOrientationLandscapeLeft,
   UIDeviceOrientationLandscapeRight,
   UIDeviceOrientationFaceUp,
   UIDeviceOrientationFaceDown
} UIDeviceOrientation;

typedef enum {
   UIInterfaceOrientationPortrait           = UIDeviceOrientationPortrait,
   UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
   UIInterfaceOrientationLandscapeLeft      = UIDeviceOrientationLandscapeRight,
   UIInterfaceOrientationLandscapeRight     = UIDeviceOrientationLandscapeLeft
} UIInterfaceOrientation;
...