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