You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:44:36