iPhone相机,如何避免预览视图上的cameraOverlay;如何知道何时进入预览视图

作者:编程家 分类: objective 时间:2025-04-22

如何避免预览视图上的cameraOverlay

在使用iPhone相机进行拍摄时,预览视图上的cameraOverlay可能会干扰我们的拍摄体验。然而,我们可以采取一些措施来避免这种情况的发生。

一种方法是使用AVCaptureVideoPreviewLayer来创建预览视图。通过这种方式,我们可以完全控制预览视图的样式和布局,而不会受到系统默认的cameraOverlay的影响。下面是一个简单的示例代码:

swift

import AVFoundation

import UIKit

class 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,表示我们已经离开了预览视图。

下面是一个示例代码,展示了如何在进入和离开预览视图时触发一些操作:

swift

class 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的值来判断当前是否进入或离开了预览视图。

通过这种方式,我们可以在进入和离开预览视图时进行一些自定义的操作,以满足我们的需求。