UIImagePickerController (с использованием камеры в качестве источника) выполняет автоматическое вращение на iPad2, как мне это остановить? - PullRequest
4 голосов
/ 18 апреля 2011

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

Вот как я реализую приложение: я использую 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, но он все еще вращается.

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

Ответы [ 4 ]

5 голосов
/ 25 апреля 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]; 
0 голосов
/ 26 ноября 2013

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

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

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

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

- (BOOL)shouldAutorotate{
return NO;
}

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

UIImagePickerSubclass *camera = [UIImagePickerSubclass new];

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

0 голосов
/ 25 апреля 2011

Вы можете компенсировать вращение вашего 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;
        }
    }
 }
}
0 голосов
/ 18 апреля 2011

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

...