如何避免预览视图上的cameraOverlay
在使用iPhone相机进行拍摄时,预览视图上的cameraOverlay可能会干扰我们的拍摄体验。然而,我们可以采取一些措施来避免这种情况的发生。一种方法是使用AVCaptureVideoPreviewLayer来创建预览视图。通过这种方式,我们可以完全控制预览视图的样式和布局,而不会受到系统默认的cameraOverlay的影响。下面是一个简单的示例代码:swiftimport AVFoundationimport UIKitclass CameraViewController: UIViewController { var previewView: UIView! var captureSession: AVCaptureSession! var videoPreviewLayer: AVCaptureVideoPreviewLayer! override func viewDidLoad() { super.viewDidLoad() // 创建预览视图 previewView = UIView(frame: view.bounds) view.addSubview(previewView) // 初始化摄像头 captureSession = AVCaptureSession() guard let videoDevice = AVCaptureDevice.default(for: .video), let videoInput = try? AVCaptureDeviceInput(device: videoDevice), captureSession.canAddInput(videoInput) else { return } captureSession.addInput(videoInput) // 创建预览图层 videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) videoPreviewLayer.videoGravity = .resizeAspectFill videoPreviewLayer.frame = previewView.bounds previewView.layer.addSublayer(videoPreviewLayer) // 启动摄像头 captureSession.startRunning() }}在这个示例代码中,我们创建了一个CameraViewController类来管理相机界面。在viewDidLoad()方法中,我们首先创建了一个预览视图previewView,并将其添加到当前视图控制器的视图层级中。然后,我们初始化了一个AVCaptureSession对象,并添加了一个AVCaptureDeviceInput作为视频输入。接下来,我们创建了一个AVCaptureVideoPreviewLayer对象,并将其添加到预览视图的图层中。最后,我们启动了摄像头的捕捉会话。通过这种方式,我们可以完全控制预览视图的外观,而不会受到系统默认的cameraOverlay的干扰。如何知道何时进入预览视图除了避免cameraOverlay的干扰外,我们还可能希望知道何时进入预览视图,以便执行一些自定义的操作。我们可以通过监听AVCaptureSession的running属性来实现这一目的。当摄像头的捕捉会话开始运行时,running属性将变为true,表示我们已经进入了预览视图。相反,当捕捉会话停止运行时,running属性将变为false,表示我们已经离开了预览视图。下面是一个示例代码,展示了如何在进入和离开预览视图时触发一些操作:swiftclass CameraViewController: UIViewController { var captureSession: AVCaptureSession! override func viewDidLoad() { super.viewDidLoad() captureSession = AVCaptureSession() // 监听捕捉会话的running属性 captureSession.addObserver(self, forKeyPath: "running", options: .new, context: nil) } override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if keyPath == "running", let isRunning = change?[.newKey] as? Bool { if isRunning { // 进入预览视图,执行一些操作 print("进入预览视图") } else { // 离开预览视图,执行一些操作 print("离开预览视图") } } }}在这个示例代码中,我们在CameraViewController类中添加了一个观察者,来监听captureSession的running属性。当running属性发生变化时,我们会收到通知,并根据isRunning的值来判断当前是否进入或离开了预览视图。通过这种方式,我们可以在进入和离开预览视图时进行一些自定义的操作,以满足我们的需求。