You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

UIImagePickerController:全屏显示相机的正确实现方式?

解决UIImagePickerController相机模式底部黑条的全屏显示问题

我之前也被这个底部黑条的问题折腾过,试过你说的那些方法,确实踩过不少坑!下面给你分享几个靠谱的解决方案:

方案一:正确计算cameraViewTransform,避免画面放大

你之前说的cameraViewTransform方案复杂还会放大,大概率是计算方式不对。其实可以通过匹配屏幕和相机的比例来调整,不会出现过度放大的情况:

  1. 先获取当前设备的屏幕比例和相机的默认预览比例:
let screenSize = UIScreen.main.bounds.size
let screenRatio = screenSize.height / screenSize.width
let cameraRatio = 4.0 / 3.0 // 多数设备相机默认预览比例为4:3,也可根据实际相机格式动态获取
  1. 根据比例差计算适配的缩放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)
}
  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

火山引擎 最新活动