UIImagePickerController cameraViewTransform игнорирует "масштабирование" и "перевод" на бета-версию iOS 10

Я использовал ниже код для масштабирования моего предварительного просмотра UIImagePickerController для заполнения всего экрана. До сих пор это отлично работало. До нескольких дней я установил iOS 10 beta 7 на iPhone 5, и он больше не масштабируется. Я вижу черный патч внизу представления UIImagePickerController. Кажется, что cameraViewTransform игнорирует вызовы CGAffineTransformMakeScale и CGAffineTransformMakeTranslation.

Вот как я запускаю контроллер камеры. Я установил "allowEditing" и "showsCameraControls" на "NO", чтобы предоставить собственное пользовательское представление оверлей.

objImagePickerController =[[UIImagePickerController alloc] init];

objImagePickerController.delegate = self;
objImagePickerController.sourceType =UIImagePickerControllerSourceTypeCamera;
objImagePickerController.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
objImagePickerController.allowsEditing = NO;
objImagePickerController.showsCameraControls= NO;

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

CGSize screenSize = [[UIScreen mainScreen] bounds].size;
float screenHeight= MAX(screenSize.height, screenSize.width);
float screenWidth= MIN(screenSize.height, screenSize.width);

float cameraAspectRatio = 4.0 / 3.0;
float imageWidth = floorf(screenWidth * cameraAspectRatio);
float scale = ceilf((screenHeight / imageWidth) * 10.0) / 10.0;

objImagePickerController.cameraViewTransform= CGAffineTransformMakeScale(scale, scale);

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

 [[[UIApplication sharedApplication] keyWindow]addSubview:objImagePickerController.view];

снимок экрана с iPhone 5s, запущенного на iOS 10 beta 8

введите описание изображения здесь

снимок экрана с iPhone 5s, работающий на iOS 8.2

введите описание изображения здесь

Как видно из приведенных выше скриншотов, cameraViewTransform не соблюдает CGAffineTransformMakeScale в iOS 10 beta.

Кто-нибудь еще сталкивался с этой проблемой? Это действительно странное поведение, появившееся в бета-версии iOS 10. Я не могу найти обходное решение для этого. Пожалуйста, порекомендуйте.

ПРИМЕЧАНИЕ:: objImagePickerController - это экземпляр UIImagePickerController.

Ответ 1

Странно это только позволяет нам преобразовать его после. Презентация завершена.

Пример:

self.presentViewController(
        self.imagePicker,
        animated: true,
        completion: {
            let screenSize = UIScreen.mainScreen().bounds.size
            let ratio: CGFloat = 4.0 / 3.0
            let cameraHeight: CGFloat = screenSize.width * ratio
            let scale: CGFloat = screenSize.height / cameraHeight

            self.imagePicker.cameraViewTransform = CGAffineTransformMakeTranslation(0, (screenSize.height - cameraHeight) / 2.0)
            self.imagePicker.cameraViewTransform = CGAffineTransformScale(self.imagePicker.cameraViewTransform, scale, scale)
        }
    )

Этот код преобразует вид камеры в соответствии с размером экрана.

Обратите внимание, что это обходной путь. Он работает, но пользователь увидит его изменение размера после презентации.

Ответ 2

Как указано в здесь, эта проблема была исправлена ​​в iOS 10.2, и вы можете использовать свойство cameraViewTransform, прежде чем снова представить камеру.

Ответ 3

Я решил, задерживая установку cameraViewTransform после камеры e Повышен уровень AVCaptureSessionDidStartRunningNotification:

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

-

- (void)cameraIsReadyNotification:(NSNotification *)notification  
 {  
          dispatch_async(dispatch_get_main_queue(), ^{  
          float scale = ceilf((screenHeight / imageWidth) * 10.0) / 10.0;

          objImagePickerController.cameraViewTransform=CGAffineTransformMakeScale(scale, scale);
          });  
  }

Ответ 4

У меня была такая же проблема и в IOS 9.3. Вот код, который я использовал

//transform values for full screen support
#define CAMERA_TRANSFORM_X 1
#define CAMERA_TRANSFORM_Y 1.12412    

        if (IS_IPAD)
            CGAffineTransformScale(objImagePickerController.cameraViewTransform, CAMERA_TRANSFORM_X,  CAMERA_TRANSFORM_Y);
        else if (IS_IPHONE_5_Land||IS_IPHONE_4_Land||IS_IPHONE_6_Land||IS_IPHONE_6_PLUS_Land)
        {
            objImagePickerController.cameraViewTransform = CGAffineTransformScale(CGAffineTransformIdentity, 2, 2);
        }

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

Ответ 5

У меня была такая же проблема в приложении с расширенной реальностью и, наконец, решила ее, используя AVFoundation, а не UIImagePickerController. Кажется, что cameraViewTransform больше не работает на iOS 10.

Следующий код работал у меня. Добавьте функцию в свой подкласс UIViewController и вызовите ее.

- (BOOL) initCamera {

    AVCaptureSession *captureSesion = [[AVCaptureSession alloc] init];
    if ([captureSesion canSetSessionPreset:AVCaptureSessionPresetHigh]) {
        [captureSesion setSessionPreset:AVCaptureSessionPresetHigh];
    } else {
        return false;
    }
    AVCaptureDevice *camera = nil;
    NSArray<AVCaptureDevice*>* devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    // Select back camera
    for (AVCaptureDevice *device in devices) {
        if ([device position]==AVCaptureDevicePositionBack) {
            camera = device;
            break;
        }
    }
    if (camera == nil) {
        // Back camera not found.
        return false;
    }

    AVCaptureStillImageOutput *imageOutput = [[AVCaptureStillImageOutput alloc]init];
    [imageOutput setOutputSettings: @{AVVideoCodecKey: AVVideoCodecJPEG}];
    AVCaptureDeviceInput *deviceInput = [[AVCaptureDeviceInput alloc]initWithDevice:camera error: nil];

    if (![captureSesion canAddInput:deviceInput] || ![captureSesion canAddOutput:imageOutput]) {
        return false;
    }
    [captureSesion addInput:deviceInput];
    [captureSesion addOutput:imageOutput];

    AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:captureSesion];

    // "Aspect Fill" is suitable for fullscreen camera.
    layer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    layer.frame = self.view.bounds;
    layer.connection.videoOrientation = AVCaptureVideoOrientationPortrait;

    [self.view.layer addSublayer:layer];
    [captureSesion startRunning];

    return true;
}

Самое главное - использовать AVLayerVideoGravityResizeAspectFill. При такой конфигурации просмотр камеры заполняет представление контейнера, сохраняя его исходное соотношение сторон.

Не забудьте импортировать фреймворк:)

#import <AVFoundation/AVFoundation.h>

Ответ 6

corrigé dans la version ios 10.2 Проблема решена в версии ios 10.2