11

我一直在使用下面的代码来缩放 UIImagePickerController 的实时预览以填满整个屏幕。到目前为止,这工作得很好。几天前,我在 iPhone 5 上安装了 iOS 10 beta 7,但它不再扩展。我可以在 UIImagePickerController 的视图底部看到黑色补丁。似乎cameraViewTransform忽略了CGAffineTransformMakeScaleandCGAffineTransformMakeTranslation电话。

这就是我启动相机控制器的方式。我已将“allowsEditing”和“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];

在 iOS 10 beta 8 上运行的 iPhone 5s 的屏幕截图

在此处输入图像描述

在 iOS 8.2 上运行的 iPhone 5s 的屏幕截图

在此处输入图像描述

从上面的屏幕截图中可以看出,iOS 10 测试版中的cameraViewTransform不尊重CGAffineTransformMakeScale

还有其他人遇到过这个问题吗?这是 iOS 10 beta OS 中出现的一种非常奇怪的行为。我无法找到解决方法。请指教。

注意:: objImagePickerController 是 UIImagePickerController 的一个实例。

4

5 回答 5

7

奇怪的是,它只允许我们在演示完成后对其进行转换。

例子:

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)
        }
    )

此代码将转换相机视图以匹配屏幕尺寸。

请注意,这是一种解决方法。它可以工作,但用户会在演示时看到它调整大小。

于 2016-09-16T14:57:29.727 回答
5

正如在此处回答的那样,此问题已在 iOS 10.2 中修复,您可以cameraViewTransform在再次展示相机之前使用该属性。

于 2016-11-12T09:46:19.090 回答
2

我已经通过在相机 e AVCaptureSessionDidStartRunningNotification 引发后延迟设置 cameraViewTransform 来解决:

 [[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);
          });  
  }
于 2016-09-23T09:44:43.640 回答
1

我之前在 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);
        }

希望这可以帮助

于 2016-09-06T06:47:39.460 回答
1

我在增强现实应用程序中遇到了同样的问题,最后通过使用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>
于 2016-09-16T14:38:00.933 回答