Imagepicker 覆盖仅在 ios 10 中不全屏显示
Imagepicker overlay not display in fullscreen only in ios 10
我正在使用 Imagepicker 覆盖来捕捉照片。在 iOS 9 中,我的代码工作正常,但是当我 运行 我的代码在 iOS 10 中时,它在底部显示一个 space,但在 iOS 上没有显示9.我试图解决它,但我做不到。
这是我产生问题的代码:
- (void)openCamerawithOption :(UIImagePickerControllerCameraCaptureMode)camType
{
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
[[NSOperationQueue mainQueue] addOperation:[NSBlockOperation blockOperationWithBlock:^{
[self createImagePicker:camType];
}]];
}
}
-(void)createImagePicker :(UIImagePickerControllerCameraCaptureMode)camType
{
if (!imagePickerController) {
imagePickerController = [[NonRotatableImagePickerController alloc] init];
}
//[imagePickerController.view setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height+(iOS7?0:20.0))];
[APPSINGLETON setBorder:imagePickerController.view color:[UIColor redColor]];
imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;
imagePickerController.delegate = self;
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePickerController.allowsEditing = YES;
imagePickerController.videoMaximumDuration = 60.0;
if (iOS7) {
CGSize screenBounds = APPDELEGATE.screenSize;
CGFloat cameraAspectRatio = 4.0f/3.0f;
CGFloat camViewHeight = screenBounds.width * cameraAspectRatio;
CGFloat scale = screenBounds.height / camViewHeight;
imagePickerController.cameraViewTransform = CGAffineTransformMakeTranslation(0, (screenBounds.height - camViewHeight) / 2.0);
imagePickerController.cameraViewTransform = CGAffineTransformScale(imagePickerController.cameraViewTransform, scale, scale);
} else {
float cameraAspectRatio = 4.0 / 3.0;
float imageWidth = floorf(APPDELEGATE.screenSize.width * cameraAspectRatio);
float scale = ceilf(((APPDELEGATE.screenSize.height+20.0) / imageWidth) * 10.0) / 10.0;
imagePickerController.cameraViewTransform = CGAffineTransformMakeScale(scale, scale);
}
imagePickerController.mediaTypes = [NSArray arrayWithObjects:(NSString )kUTTypeMovie, (NSString )kUTTypeImage, nil];
imagePickerController.cameraCaptureMode = camType;
imagePickerController.showsCameraControls = NO;
imagePickerController.toolbar.hidden=YES;
imagePickerController.wantsFullScreenLayout = YES;
// not all devices have two cameras or a flash so just check here
if ([UIImagePickerController isCameraDeviceAvailable: UIImagePickerControllerCameraDeviceRear])
{
imagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceRear;
}
else
{
imagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceFront;
}
if ([UIImagePickerController isFlashAvailableForCameraDevice:imagePickerController.cameraDevice])
{
imagePickerController.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto;
}
[self performSelectorOnMainThread:@selector(presentPicker) withObject:nil waitUntilDone:YES];
}
-(void)presentPicker
{
[self presentViewController:imagePickerController animated:YES completion:nil];
imagePickerController.cameraOverlayView = transparentView;
}
这是截图
更新:
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)
}
)
This solution from below is working for me except when I rotate the device the same issue returns.
UIImagePickerController's cameraViewTransform is ignoring 'scaling' and 'translation' on iOS 10 beta
你的presentPicker方法中的transparentView是什么?尝试像这样设置它的框架:
transparentView.frame = imagePickerController.view.bounds;
imagePickerController.cameraOverlayView = transparentView;
[self presentViewController:imagePickerController animated:YES completion:nil];
@chirag shah 我没有在 ios10 中找到 imagePicker 转换的好解决方案。我只是从我的 ios 10 项目中省略了 imagepicker,并将 AVCaptureSession 与视频重力 AVLayerVideoGravityResizeAspectFill 用于 AVCaptureVideoPreviewLayer 对象。它运行完美。
实际上我遇到了同样的问题。由于找不到合适的解决方案,我只是将视图的 ty 转换为
CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, sizeMissingAtBottom);
imagePickerController.cameraViewTransform = translate;
然后,如果需要,您可以CGAffineTransformScale
翻译。
我正在使用 Imagepicker 覆盖来捕捉照片。在 iOS 9 中,我的代码工作正常,但是当我 运行 我的代码在 iOS 10 中时,它在底部显示一个 space,但在 iOS 上没有显示9.我试图解决它,但我做不到。
这是我产生问题的代码:
- (void)openCamerawithOption :(UIImagePickerControllerCameraCaptureMode)camType
{
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
[[NSOperationQueue mainQueue] addOperation:[NSBlockOperation blockOperationWithBlock:^{
[self createImagePicker:camType];
}]];
}
}
-(void)createImagePicker :(UIImagePickerControllerCameraCaptureMode)camType
{
if (!imagePickerController) {
imagePickerController = [[NonRotatableImagePickerController alloc] init];
}
//[imagePickerController.view setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height+(iOS7?0:20.0))];
[APPSINGLETON setBorder:imagePickerController.view color:[UIColor redColor]];
imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;
imagePickerController.delegate = self;
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePickerController.allowsEditing = YES;
imagePickerController.videoMaximumDuration = 60.0;
if (iOS7) {
CGSize screenBounds = APPDELEGATE.screenSize;
CGFloat cameraAspectRatio = 4.0f/3.0f;
CGFloat camViewHeight = screenBounds.width * cameraAspectRatio;
CGFloat scale = screenBounds.height / camViewHeight;
imagePickerController.cameraViewTransform = CGAffineTransformMakeTranslation(0, (screenBounds.height - camViewHeight) / 2.0);
imagePickerController.cameraViewTransform = CGAffineTransformScale(imagePickerController.cameraViewTransform, scale, scale);
} else {
float cameraAspectRatio = 4.0 / 3.0;
float imageWidth = floorf(APPDELEGATE.screenSize.width * cameraAspectRatio);
float scale = ceilf(((APPDELEGATE.screenSize.height+20.0) / imageWidth) * 10.0) / 10.0;
imagePickerController.cameraViewTransform = CGAffineTransformMakeScale(scale, scale);
}
imagePickerController.mediaTypes = [NSArray arrayWithObjects:(NSString )kUTTypeMovie, (NSString )kUTTypeImage, nil];
imagePickerController.cameraCaptureMode = camType;
imagePickerController.showsCameraControls = NO;
imagePickerController.toolbar.hidden=YES;
imagePickerController.wantsFullScreenLayout = YES;
// not all devices have two cameras or a flash so just check here
if ([UIImagePickerController isCameraDeviceAvailable: UIImagePickerControllerCameraDeviceRear])
{
imagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceRear;
}
else
{
imagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceFront;
}
if ([UIImagePickerController isFlashAvailableForCameraDevice:imagePickerController.cameraDevice])
{
imagePickerController.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto;
}
[self performSelectorOnMainThread:@selector(presentPicker) withObject:nil waitUntilDone:YES];
}
-(void)presentPicker
{
[self presentViewController:imagePickerController animated:YES completion:nil];
imagePickerController.cameraOverlayView = transparentView;
}
这是截图
更新:
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)
}
)
This solution from below is working for me except when I rotate the device the same issue returns.
UIImagePickerController's cameraViewTransform is ignoring 'scaling' and 'translation' on iOS 10 beta
你的presentPicker方法中的transparentView是什么?尝试像这样设置它的框架:
transparentView.frame = imagePickerController.view.bounds;
imagePickerController.cameraOverlayView = transparentView;
[self presentViewController:imagePickerController animated:YES completion:nil];
@chirag shah 我没有在 ios10 中找到 imagePicker 转换的好解决方案。我只是从我的 ios 10 项目中省略了 imagepicker,并将 AVCaptureSession 与视频重力 AVLayerVideoGravityResizeAspectFill 用于 AVCaptureVideoPreviewLayer 对象。它运行完美。
实际上我遇到了同样的问题。由于找不到合适的解决方案,我只是将视图的 ty 转换为
CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, sizeMissingAtBottom);
imagePickerController.cameraViewTransform = translate;
然后,如果需要,您可以CGAffineTransformScale
翻译。