2016-01-21 3 views
0

Приложение для iPad можно использовать только в ландшафтных ориентациях. После того, как мне кажется, что я просмотрел десятки ответов в стеке, я не могу правильно правильно сделать фотографию (метаданные исправляют ее, но полезны только для макинтошей). Когда приложение физически находится в LandscapeLeft, оно возвращает фотографию вверх ногами, тогда как в LandscapeRight это правильно.iOS: фотографии с обратной стороны камеры вверх ногами, передние фотографии справа вверх

Насколько я могу судить, установка VideoOrientation для слоя предварительного просмотра обеспечивает правильную ориентацию при предварительном просмотре фотографии.

_capturePreview = [[ISCapturePreview alloc] init]; 
    [self addSubview:_capturePreview]; 

    // Session 
    self.session = [AVCaptureSession new]; 
    [self.session setSessionPreset:AVCaptureSessionPresetPhoto]; 

    // Capture device 
    AVCaptureDevice* inputDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
    NSError *error; 

    // Device input 
    self.deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:&error]; 
    if ([self.session canAddInput:self.deviceInput]) 
     [self.session addInput:self.deviceInput]; 

    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; 

    // Preview 
    AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.session]; 
    [previewLayer setBackgroundColor:[[UIColor blackColor] CGColor]]; 
    [previewLayer.connection setVideoOrientation:(AVCaptureVideoOrientation)orientation]; 
    [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 
    CALayer *rootLayer = [[self capturePreview] layer]; 
    [rootLayer setMasksToBounds:YES]; 
    [previewLayer setFrame:CGRectMake(0, 0, 1024, 600)]; 
    [rootLayer insertSublayer:previewLayer atIndex:0]; 

    AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; 
    if ([self.session canAddOutput:stillImageOutput]) 
    { 
     [stillImageOutput setOutputSettings:@{AVVideoCodecKey : AVVideoCodecJPEG}]; 
     [self.session addOutput:stillImageOutput]; 
     [self setStillImageOutput:stillImageOutput]; 
    } 

    [self.session startRunning]; 

И код выхода здесь. Настройка VideoOrientation здесь в моих тестах не влияет.

- (void)takePhotoButtonWasPressed:(id)sender{ 
[[[self stillImageOutput] connectionWithMediaType:AVMediaTypeVideo] setVideoOrientation:[[(AVCaptureVideoPreviewLayer *)[[self capturePreview] layer] connection] videoOrientation]]; 

// Capture a still image. 
[[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:[[self stillImageOutput] connectionWithMediaType:AVMediaTypeVideo] completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { 

    if (imageDataSampleBuffer) 
    { 
     NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; 
     UIImage *image = [[UIImage alloc] initWithData:imageData]; 
}];} 

ответ

0

В настоящее время я не могу проверить код сам, но если вы установите доступные ориентации (в настройках проекта) на обоих landscapeLeft и landscapeRight, IOS может быть обработка самой ориентации, поэтому постарайтесь не устанавливать ориентацию. Кроме того, если вы измените ориентацию устройства после загрузки представления, вы будете использовать неправильную ориентацию, поэтому подумайте о добавлении наблюдателя для проверки изменений. Кроме того, яблоко говорит, что вы должны использовать UITraitCollection и UITraitEnvironment вместо UIInterfaceOrientation, начиная с iOS8.

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

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

  • Нет связанных вопросов^_^