UIImagePickerController:全屏显示相机的正确实现方式?
解决UIImagePickerController相机模式底部黑条的全屏显示问题
我之前也被这个底部黑条的问题折腾过,试过你说的那些方法,确实踩过不少坑!下面给你分享几个靠谱的解决方案:
方案一:正确计算cameraViewTransform,避免画面放大
你之前说的cameraViewTransform方案复杂还会放大,大概率是计算方式不对。其实可以通过匹配屏幕和相机的比例来调整,不会出现过度放大的情况:
- 先获取当前设备的屏幕比例和相机的默认预览比例:
let screenSize = UIScreen.main.bounds.size let screenRatio = screenSize.height / screenSize.width let cameraRatio = 4.0 / 3.0 // 多数设备相机默认预览比例为4:3,也可根据实际相机格式动态获取
- 根据比例差计算适配的缩放transform:
var transform = CGAffineTransform.identity if screenRatio > cameraRatio { // 屏幕纵向更长,垂直方向缩放适配 let scale = screenRatio / cameraRatio transform = transform.scaledBy(x: 1, y: scale) } else { // 屏幕横向更宽,水平方向缩放适配 let scale = cameraRatio / screenRatio transform = transform.scaledBy(x: scale, y: 1) }
- 将计算好的transform赋值给图片选择器,同时配合全屏展示:
let picker = UIImagePickerController() picker.sourceType = .camera picker.cameraViewTransform = transform picker.modalPresentationStyle = .fullScreen present(picker, animated: true)
这样调整后,相机画面会刚好适配全屏,不会出现不必要的放大,底部黑条也会消失。
方案二:用AVFoundation自定义相机(更灵活彻底)
如果觉得UIImagePickerController的限制太多,直接用AVFoundation封装自己的相机界面是更彻底的方案——不仅能实现完美全屏,还能自定义拍照按钮、添加滤镜、调整参数等。当然这个方案需要写更多代码,适合对相机功能有定制需求的场景。
为什么单独设置modalPresentationStyle=.fullScreen没用?
因为UIImagePickerController的相机预览层默认比例是4:3,而当前手机屏幕比例(比如iPhone的19.5:9)和这个比例不匹配。即使你设置了全屏展示,系统还是会给预览层加上黑边来维持原始比例,必须配合调整cameraViewTransform,让预览层适配屏幕比例才能去掉黑条。
内容的提问来源于stack exchange,提问作者AppsDev




