UIImagePickerController (с использованием камеры в качестве источника) выполняет автоповорот на iPad2, как мне остановить это?

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

Вот как я реализую приложение: я использую UIImagePickerController для того, кто пользователь, что принимает камера, и добавляю UIImageView в cameraOverlayView в качестве подпредставления, чтобы оно работало следующим образом:
(изображение на http://www.manna-soft.com/test/uploads/UIImagePickerView-portrait.jpg < / а>)

Это работает нормально, пока iPad2 не встанет на место ... он автоматически поворачивается и разрушает макет:
(изображение на
http://www.manna-soft.com/test/uploads/UIImagePickerView-landscape.jpg)

UIImagePickerController никогда не вращается на iphone, ipod touch или оригинальном iPad, но это происходит на iPad2. ссылка на класс UIImagePickerContrller говорит, что он «поддерживает только портретный режим», но что происходит, он автоповорачивается таким образом ....
Есть ли способ отключить авторотацию?
Я попытался вернуть NO в метод shouldAutorotateToInterfaceOrientation: контроллера представления, который представлен UIImagePickerController, но он все еще вращается.

Заранее спасибо.


person Eric    schedule 18.04.2011    source источник
comment
Вы случайно нашли решение для этого   -  person Nash    schedule 20.04.2011
comment
Я сделал что-то похожее на предложение MarcVivet, сделав перевернутую анимацию, чтобы противостоять авторотации. Думаю, я попробую решение ur позже, потому что это кажется более аккуратным для этого (у меня нет ipad2, чтобы попробовать прямо сейчас).   -  person Eric    schedule 27.04.2011


Ответы (4)


Вы можете компенсировать вращение вашего ipad, изменив вид наложения вашего UIImagePickerController. Во-первых, вам нужно захватить уведомления, используя:

[[NSNotificationCenter defaultCenter]     addObserver:self selector:@selector(notificationCallback:) name:nil object:nil];

Затем используйте этот код:

 - (void) notificationCallback:(NSNotification *) notification {
  if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    if ([[notification name] isEqualToString:@"UIDeviceOrientationDidChangeNotification"]) { 

        UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

        switch ( orientation ) {
            case UIInterfaceOrientationLandscapeRight:
                NSLog(@"LandcapeRight");
                [UIView beginAnimations:@"LandscapeRight" context:UIGraphicsGetCurrentContext()];
                [UIView setAnimationDuration:0.4];
                m_uiCameraOverlayView.transform = CGAffineTransformIdentity;
                [UIView commitAnimations];
                break;
            case UIInterfaceOrientationLandscapeLeft:
                NSLog(@"LandscapeLeft");
                [UIView beginAnimations:@"LandcapeLeft" context:UIGraphicsGetCurrentContext()];
                [UIView setAnimationDuration:0.4];
                m_uiCameraOverlayView.transform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(M_PI), 0, 0);
                [UIView commitAnimations];
                break;
            case UIInterfaceOrientationPortraitUpsideDown:
                NSLog(@"UpsideDown");
                [UIView beginAnimations:@"UpsideDown" context:UIGraphicsGetCurrentContext()];
                [UIView setAnimationDuration:0.4];
                m_uiCameraOverlayView.transform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(-M_PI / 2), -128, -128);
                [UIView commitAnimations];
                break;
            case UIInterfaceOrientationPortrait:
                NSLog(@"Portrait");
                [UIView beginAnimations:@"Portrait" context:UIGraphicsGetCurrentContext()];
                [UIView setAnimationDuration:0.4];
                m_uiCameraOverlayView.transform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(M_PI / 2), 128, 128);
                [UIView commitAnimations];
                break;
            default:
                NSLog(@"????");
                break;
        }
    }
 }
}
person MarcVivet    schedule 25.04.2011
comment
Это то, что я делаю прямо сейчас, хотя код длинный, он выполняет свою работу за меня. Вместо использования центра уведомлений я реализовал код в методе willRotateToInterfaceOrientation: duration:, чтобы я точно знал, сколько времени потребуется для выполнения поворота. - person Eric; 27.04.2011
comment
Я пробовал это с вашим предложением и с Эриком, но ни один из методов не помог. На iPad 2 я получаю МНОГО UIDeviceOrientationDidChangeNotifications, по крайней мере, 2 каждый раз, когда он вращается, и вращение никогда не поддерживалось должным образом. - person Brian Robbins; 03.06.2011
comment
Этот код предназначен только для альбомной ориентации, если вы хотите использовать портретный режим, вы должны изменить преобразование ... ¬_¬ - person MarcVivet; 03.06.2011

В окно может быть добавлено представление наложения, а в window.superview можно установить значение cameraOverlayView. При отклонении ModalController представление наложения может быть удалено из окна.

Это решение может быть немного сложным в применении в зависимости от того, как структурировано ваше приложение.

YourAppDelegate *appDelegate = (YourAppDelegate *) [[UIApplication sharedApplication] delegate];
[appDelegate.window addSubview:overlayView];
imagePickerController.cameraOverlayView = appDelegate.window.superview;


//When dismissing the UIImagePicker
 [self dismissModalViewControllerAnimated:YES];
 [OverlayView removeFromSuperview]; 
person Nash    schedule 25.04.2011
comment
Я никогда не думал об этом ... если я добавлю в окно подпредставление, не повернется ли оно никогда (потому что окно не вращается)? - person Eric; 27.04.2011
comment
Это решение сработало для меня, но MarcVivet выше - нет. Спасибо! - person Brian Robbins; 03.06.2011

Поскольку UIImagePickerController является производным от UINavigationController, производного от UIViewController, вы можете проверить это на странице "Handling View Rotations" в документе UIViewController, чтобы узнать, помогает ли эта информация.

person Todd Hopkinson    schedule 18.04.2011
comment
Я попытался создать подкласс UIImagePickerController и переопределить метод shouldAutorotateToInterfaceOrientation: так, чтобы он возвращал ДА, только если это портретный режим ... но он не работает, метод выводит что-то на консоль при его вызове, и я обнаружил, что метод вообще никогда не вызывается .... любая идея, почему это так? - person Eric; 18.04.2011

Вы заметите, что когда вы это сделаете:

UIImagePickerController *camera = [UIImagePickerController new];
NSLog([self.camera shouldAutorotate] ? @"YES" : @"NO");

Результат будет ДА. Думаю, по умолчанию установлено ДА.

Вы можете создать подкласс UIImagePickerController и добавить этот метод, чтобы переопределить этот метод:

- (BOOL)shouldAutorotate{
return NO;
}

Затем вместо использования UIImagePickerController используйте созданный вами подкласс.

UIImagePickerSubclass *camera = [UIImagePickerSubclass new];

Надеюсь это поможет :)

person aalesano    schedule 26.11.2013