我正在尝试在我的Swift应用程序中打开和关闭iOS设备的手电筒。
通过查看文档,我可以看到lockForConfiguration()
,setTorchModeOn(1.0)
和unlockForConfiguration()
是我需要调用的。
然而,这些方法显然是not in scope
。我的第一个想法是这些方法是针对Objective-C
的,但是文档显示这些方法实际上是针对Swift的。
我可能调用这些方法不正确。然而,从我所看到的,我可以称这些方法为raw(没有父脚本/类)。
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Hello")
}
func turnTorchOn() {
lockForConfiguration()
setTorchModeOn(1.0)
unlockForConfiguration()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
AVCaptureDevice仅适用于Objective-C,我能找到的其他一切也适用于Objective-C。有人能解释一下我如何在Swift中做到这一点吗?提前感谢!
您需要一个AVCaptureDevice
实例来调用这些方法。
import SwiftUI
import Combine
import AVKit
class CaptureSession: ObservableObject {
lazy var device = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
}
struct ContentView: View {
@StateObject var session = CaptureSession()
var body: some View {
Text("Hello")
.onTapGesture {
turnTorchOn()
}
}
func turnTorchOn() {
do {
let device = session.device
try device?.lockForConfiguration()
defer { device?.unlockForConfiguration() }
try device?.setTorchModeOn(level: 1.0)
} catch {
print("Can't turn torch on, check device has LED flash!")
}
}
}
在这个例子中,我们获得了设备的默认后置摄像头(假设它有一个火炬),当我们点击标签时,我们将特定的设备设置为打开。因为SwiftUI视图可以在任何时候重新绘制,我们需要让device
在视图在屏幕上的时候就存在,所以我们在StateObject
中持久化它。