AVFoundation:如何利用AVCaptureDevice检测微距模式?
AVFoundation:如何利用AVCaptureDevice检测微距模式?
嘿,刚好我之前做类似功能的时候研究过这个!你已经搞定了让设备自动触发微距模式的代码,现在要检测当前是否处于微距状态对吧?其实有两种靠谱的方式,分系统版本给你讲讲:
1. iOS 15+ 直接用系统提供的属性(最省心)
从iOS 15开始,AVCaptureDevice专门加了一个isMacroModeEnabled只读属性,直接就能拿到当前是否启用了微距模式,不用自己猜设备类型,代码超简单:
if #available(iOS 15.0, *) { let isInMacroMode = yourCaptureDevice.isMacroModeEnabled // 拿到这个布尔值后,就可以更新UI或者做对应的逻辑处理啦 }
2. 兼容iOS 15以下版本的方案
在iOS 15之前,没有直接的属性,这时候可以通过检查当前活跃的主摄组件类型来判断——因为大部分设备的微距模式是切换到超广角摄像头实现的。你可以这样写:
if let activeConstituentDevice = yourCaptureDevice.activePrimaryConstituentDevice { let isInMacroMode = activeConstituentDevice.deviceType == .builtInUltraWideCamera // 同样用这个值来处理你的逻辑 }
额外提醒:实时监听状态变化
因为微距模式可能是自动触发的(比如用户把手机凑近物体时自动切换),所以你最好监听设备状态变化的通知,这样能及时更新状态:
// 添加监听 NotificationCenter.default.addObserver(forName: AVCaptureDevice.didChangeNotification, object: yourCaptureDevice, queue: .main) { [weak self] _ in guard let self = self else { return } // 在这里重新检测微距模式状态,更新UI或者处理逻辑 self.checkAndUpdateMacroMode() } // 记得在合适的地方移除监听(比如deinit里) deinit { NotificationCenter.default.removeObserver(self) }
这样不管是自动切换还是手动切换微距模式,你都能及时捕获到状态变化啦!
备注:内容来源于stack exchange,提问作者xinatanil
相关产品推荐
相关产品推荐

