2014-01-17 3 views
0

Я использую UIImagePickerController для захвата фотографии как в portrait, так и в режиме landscape с камеры, разрешенная ориентация в моем приложении - portrait & landscape. В портретном режиме наложение на камеру работает нормально. Но с ландшафтным режимом, после захвата фото по умолчанию наклейка камеры «Предварительный просмотр» и использование кнопки & повторного действия, а также живое изображение, снятое с камеры, выходит в портретном режиме. Должен ли я использовать автоматическое изменение размера. Как я могу установить полный просмотр оверлей камеры (второй снимок экрана) в ландшафтном режиме?UIImagePickerController issue - iPhone

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

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; 

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == NO){ 
    NSLog(@"Camera not available"); 
    return; 
} 

imagePickerController.delegate = self; 
imagePickerController.allowsEditing = YES; 
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera; 
[self presentViewController:imagePickerController animated:YES completion:nil]; 

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

- (BOOL)shouldAutorotate { 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskPortrait; 
} 

вот моя камера первоначальное представление, когда мое устройство находится в ландшафтном режиме:

enter image description here

второго вида после захвата фото с камеры:

enter image description here

Моим контроллер представления, где я отображением сборщика изображений только в портретном режиме, но захват фото с камеры должна работать для портретного и альбомного с помощью сборщика изображения , Я хочу, чтобы в ландшафтном режиме наложение на мою камеру (прилагается второй снимок экрана) должно отображаться на панели предварительного просмотра Preview в нижней части экрана. Возможно ли это с наложением камеры по умолчанию или мне нужно создать пользовательский вид наложения на камеру? Пожалуйста, помогите мне исправить это. Это серьезная проблема в моем приложении.

Спасибо.

+0

У меня такая же проблема. Как вы решили проблему? – doxsi

ответ

0

Нет, вы не можете сделать это с помощью «UIImagePickerController» kindly take a look at documentation.

Важно: Класс UIImagePickerController поддерживает только портретный режим. Этот класс предназначен для использования как есть и не поддерживает подклассы. Иерархия представления для этого класса является частной и не может быть изменена с одним исключением. Вы можете назначить пользовательское представление свойству cameraOverlayView и использовать это представление для представления дополнительной информации или управления взаимодействием между интерфейсом камеры и вашим кодом.

Но вы можете использовать Assets Library Framework, чтобы получить доступ к списку изображений и создать свой собственный подборщик изображений.

Вы также можете попробовать git: ELCImagePickerController.

Счастливое кодирование.

0

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

- (void)imagePickerController:(UIImagePickerController *)picker 
    didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
     UIImage *originalImage = (UIImage*) [info objectForKey:UIImagePickerControllerOriginalImage]; 

    //--> get the fixed orientation image 
    UIImage *fixedImage = [self fixOrientation:originalImage]; 


} 


- (UIImage *)fixOrientation:(UIImage*)takenImage { 
// --> check the correct orientation if yes return the same. 
if (takenImage.imageOrientation == UIImageOrientationUp) return takenImage; 

// --> if taken image orientation is wrong adjust the image as per the correct orientation. 
CGAffineTransform transform = CGAffineTransformIdentity; 

switch (takenImage.imageOrientation) { 
     case UIImageOrientationDown: 
     case UIImageOrientationDownMirrored: 
     transform = CGAffineTransformTranslate(transform, takenImage.size.width, takenImage.size.height); 
     transform = CGAffineTransformRotate(transform, M_PI); 
     break; 

     case UIImageOrientationLeft: 
     case UIImageOrientationLeftMirrored: 
     transform = CGAffineTransformTranslate(transform, takenImage.size.width, 0); 
     transform = CGAffineTransformRotate(transform, M_PI_2); 
     break; 

     case UIImageOrientationRight: 
     case UIImageOrientationRightMirrored: 
     transform = CGAffineTransformTranslate(transform, 0, takenImage.size.height); 
     transform = CGAffineTransformRotate(transform, -M_PI_2); 
     break; 
     case UIImageOrientationUp: 
     case UIImageOrientationUpMirrored: 
     break; 
} 

switch (takenImage.imageOrientation) { 
     case UIImageOrientationUpMirrored: 
     case UIImageOrientationDownMirrored: 
     transform = CGAffineTransformTranslate(transform, takenImage.size.width, 0); 
     transform = CGAffineTransformScale(transform, -1, 1); 
     break; 

     case UIImageOrientationLeftMirrored: 
     case UIImageOrientationRightMirrored: 
     transform = CGAffineTransformTranslate(transform, takenImage.size.height, 0); 
     transform = CGAffineTransformScale(transform, -1, 1); 
     break; 
     case UIImageOrientationUp: 
     case UIImageOrientationDown: 
     case UIImageOrientationLeft: 
     case UIImageOrientationRight: 
     break; 
} 

//--> draw the calculated image above 
CGContextRef ctx = CGBitmapContextCreate(NULL, takenImage.size.width, takenImage.size.height, 
             CGImageGetBitsPerComponent(takenImage.CGImage), 0, 
             CGImageGetColorSpace(takenImage.CGImage), 
             CGImageGetBitmapInfo(takenImage.CGImage)); 
CGContextConcatCTM(ctx, transform); 
switch (takenImage.imageOrientation) { 
     case UIImageOrientationLeft: 
     case UIImageOrientationLeftMirrored: 
     case UIImageOrientationRight: 
     case UIImageOrientationRightMirrored: 

     CGContextDrawImage(ctx, CGRectMake(0,0,takenImage.size.height,takenImage.size.width), takenImage.CGImage); 
     break; 

    default: 
     CGContextDrawImage(ctx, CGRectMake(0,0,takenImage.size.width,takenImage.size.height), takenImage.CGImage); 
     break; 
} 

// return the new fixed image to display 
CGImageRef cgimg = CGBitmapContextCreateImage(ctx); 
UIImage *img = [UIImage imageWithCGImage:cgimg]; 
CGContextRelease(ctx); 
CGImageRelease(cgimg); 
return img; 
} 

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

+0

@ spiderThanks, я использовал ваш код выше, но моя проблема по-прежнему такая же. Я хочу, чтобы мой прикрепленный второй скриншот появился в пейзаже вместо портрета. –

+0

Можно ли пропустить второй снимок экрана, я хочу сказать, когда пользователь коснется кнопки камеры с первого скриншота, в это время он отклонит представление выбора (для пропуска второго скриншота) и метод didFinishPickingMediaWithInfo вызовет ..? –

+0

приведенный выше код делает то же самое, что он меняет ориентацию вашего щелканного изображения, но по умолчанию какая ориентация изображения вы хотите для этого, я в конце комментировал, что вам придется немного подкорректировать приведенный выше код, то же самое, для UIimagecontroller @iLearner правильно, вы не можете поместить его в ландшафтном режиме, но вы можете изменить ориентацию изображения для правильного отображения – spider1983

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