我遇到问题,我想在UIView边界内解决,有什么 办法可以将Camera Preview添加到UIView吗?并在 UIView 顶部添加其他内容(按钮,标签等)?
我尝试使用AVFoundation框架,但没有足够的文档 的斯威夫特。
更新为SWIFT 5 您可以尝试如下操作:
import UIKit import AVFoundation class ViewController: UIViewController{ var previewView : UIView! var boxView:UIView! let myButton: UIButton = UIButton() //Camera Capture requiered properties var videoDataOutput: AVCaptureVideoDataOutput! var videoDataOutputQueue: DispatchQueue! var previewLayer:AVCaptureVideoPreviewLayer! var captureDevice : AVCaptureDevice! let session = AVCaptureSession() override func viewDidLoad() { super.viewDidLoad() previewView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)) previewView.contentMode = UIView.ContentMode.scaleAspectFit view.addSubview(previewView) //Add a view on top of the cameras' view boxView = UIView(frame: self.view.frame) myButton.frame = CGRect(x: 0, y: 0, width: 200, height: 40) myButton.backgroundColor = UIColor.red myButton.layer.masksToBounds = true myButton.setTitle("press me", for: .normal) myButton.setTitleColor(UIColor.white, for: .normal) myButton.layer.cornerRadius = 20.0 myButton.layer.position = CGPoint(x: self.view.frame.width/2, y:200) myButton.addTarget(self, action: #selector(self.onClickMyButton(sender:)), for: .touchUpInside) view.addSubview(boxView) view.addSubview(myButton) self.setupAVCapture() } override var shouldAutorotate: Bool { if (UIDevice.current.orientation == UIDeviceOrientation.landscapeLeft || UIDevice.current.orientation == UIDeviceOrientation.landscapeRight || UIDevice.current.orientation == UIDeviceOrientation.unknown) { return false } else { return true } } @objc func onClickMyButton(sender: UIButton){ print("button pressed") } } // AVCaptureVideoDataOutputSampleBufferDelegate protocol and related methods extension ViewController: AVCaptureVideoDataOutputSampleBufferDelegate{ func setupAVCapture(){ session.sessionPreset = AVCaptureSession.Preset.vga640x480 guard let device = AVCaptureDevice .default(AVCaptureDevice.DeviceType.builtInWideAngleCamera, for: .video, position: AVCaptureDevice.Position.back) else { return } captureDevice = device beginSession() } func beginSession(){ var deviceInput: AVCaptureDeviceInput! do { deviceInput = try AVCaptureDeviceInput(device: captureDevice) guard deviceInput != nil else { print("error: cant get deviceInput") return } if self.session.canAddInput(deviceInput){ self.session.addInput(deviceInput) } videoDataOutput = AVCaptureVideoDataOutput() videoDataOutput.alwaysDiscardsLateVideoFrames=true videoDataOutputQueue = DispatchQueue(label: "VideoDataOutputQueue") videoDataOutput.setSampleBufferDelegate(self, queue:self.videoDataOutputQueue) if session.canAddOutput(self.videoDataOutput){ session.addOutput(self.videoDataOutput) } videoDataOutput.connection(with: .video)?.isEnabled = true previewLayer = AVCaptureVideoPreviewLayer(session: self.session) previewLayer.videoGravity = AVLayerVideoGravity.resizeAspect let rootLayer :CALayer = self.previewView.layer rootLayer.masksToBounds=true previewLayer.frame = rootLayer.bounds rootLayer.addSublayer(self.previewLayer) session.startRunning() } catch let error as NSError { deviceInput = nil print("error: \(error.localizedDescription)") } } func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { // do stuff here } // clean up AVCapture func stopCamera(){ session.stopRunning() } }
在这里,我使用一个UIView称为PreviewView的相机来启动摄像机,然后在PreviewView上方添加一个名为boxView 的 新UIView控件。我添加一个UIButton到 boxView
重要
请记住,在iOS 10及更高版本中,您需要先征求用户的 许可才能访问相机。您可以通过向应用程序中添加 用途密钥Info.plist以及目的字符串来完成此操作, 因为如果您未能声明用途,则应用程序在首次 进行访问时将崩溃。