关于ImagePickerController竖屏显示不正确问题

 

用过ImagePickerController,应该比较熟悉这段代码:

UIImagePickerController* imagePicker = [[UIImagePickerController alloc] init];

imagePicker.delegate = self;

 

imagePicker.sourceType = sourceType;

 

if (popover) {

 [popover release];

}

popover=[[UIPopoverController alloc]initWithContentViewController:imagePicker];

imagePicker.wantsFullScreenLayout = YES;

[popover presentPopoverFromRect: CGRectMake(vwPopover.frame.origin.x, vwPopover.frame.origin.y, vwPopover.size.width, 0)

inView:self.view

              permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

[imagePickerrelease];

说句公道点的话,SDK提供ImagePickerController确实存在着数不尽数的bug,远远称不上好用。不能设置它的frame,不能全屏,不能定制它的界面,不能连续拍照(每次只能拍一张照片),等等。

然而最近笔者又碰到了它的一个新的Bug。我有一个iPad应用,只支持人像模式(竖向),当程序使用PopOverController呈现ImagePickerController拍照界面时,相机镜头却被反时针旋转了90度(如下图所示)。

但当我关闭屏幕(确定需要关屏),将屏幕旋转至横屏,再次弹出ImagePickerController,相机镜头却显示正常:

在网上没有搜到类似的bug报告。看来只是个例,不幸偏偏被笔者遇到了。

查看苹果文档,文档说ImagePickerController只支持竖屏不支持横屏。

问题是我的应用明明只支持竖屏啊?从2张图片看,ImagePickerController明显将设备方向给判断错了,它将竖屏状态识别为横屏,而将横屏状态识别成了竖屏,这让我抓破脑袋也没想出是什么道理。

解决的办法只有在每次弹出ImagePickerController之前,检查设备方向,当设备被识别为横屏的时候(此时真正的方向却应该是竖屏。唉,将错就错吧),将ImagePickerController的方向顺时针旋转90度:

if (sourceType==UIImagePickerControllerSourceTypeCamera

           && (UIDeviceOrientationIsLandscape([[UIDevice currentDevice]orientation]))) {

           

           imagePicker.cameraViewTransform = CGAffineTransformMakeRotation(M_PI/2);

 

        }

 [popover presentPopoverFromRect: CGRectMake(vwPopover.frame.origin.x, vwPopover.frame.origin.y, vwPopover.size.width, 0)

        inView:self.view

              permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

⋯⋯

这下终于解决。



struct VideoPicker: UIViewControllerRepresentable { @Environment(.presentationMode) private var presentationMode let sourceType: UIImagePickerController.SourceType // let onImagePicked: (UIImage) -> Void let onURLPicked: (URL) -> Void final class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate { @Binding private var presentationMode: PresentationMode private let sourceType: UIImagePickerController.SourceType private let onURLPicked: (URL) -> Void init(presentationMode: Binding<PresentationMode>, sourceType: UIImagePickerController.SourceType, onURLPicked: @escaping (URL) -> Void) { presentationMode = presentationMode self.sourceType = sourceType self.onURLPicked = onURLPicked } func imagePickerController( picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { // let uiImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage // onImagePicked(uiImage) if let url = info[.mediaURL] as? URL{ onURLPicked(url) } presentationMode.dismiss() } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { presentationMode.dismiss() } } func makeCoordinator() -> Coordinator { return Coordinator(presentationMode: presentationMode, sourceType: sourceType, onURLPicked: onURLPicked) } func makeUIViewController(context: UIViewControllerRepresentableContext<VideoPicker>) -> UIImagePickerController { let picker = UIImagePickerController() picker.sourceType = sourceType picker.delegate = context.coordinator picker.mediaTypes = ["public.movie"] return picker } func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<VideoPicker>) { } }这段代码获取的url中绝对路径不准确
最新发布
05-24
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值