在UIView的背景上设置相机

我正在尝试在UIViewController的UIView背景上设置相机,以便能够在它上面绘制。

怎么做?

在此处输入图像描述

更新SWIFT 3

你可以尝试这样的事情:

我将两个UIView添加到我的UIViewController的主视图中,一个名为previewView (用于摄像头),另一个名为boxView UIView (在摄像头视图上方)

 class ViewController: UIViewController { var previewView : UIView!; var boxView:UIView!; //Camera Capture requiered properties var videoDataOutput: AVCaptureVideoDataOutput! var videoDataOutputQueue: DispatchQueue! var previewLayer:AVCaptureVideoPreviewLayer! var captureDevice : AVCaptureDevice! let session = AVCaptureSession() var currentFrame: CIImage! var done = false 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 = UIViewContentMode.scaleAspectFit view.addSubview(previewView) //Add a box view boxView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 200)) boxView.backgroundColor = UIColor.green boxView.alpha = 0.3 view.addSubview(boxView) self.setupAVCapture() } override func viewWillAppear(_ animated: Bool) { if !done { session.startRunning() } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } 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 } } } // 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.front) else{ return } captureDevice = device beginSession() done = true } 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(withMediaType: AVMediaTypeVideo).isEnabled = true self.previewLayer = AVCaptureVideoPreviewLayer(session: self.session) self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspect let rootLayer: CALayer = self.previewView.layer rootLayer.masksToBounds = true self.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) { currentFrame = self.convertImageFromCMSampleBufferRef(sampleBuffer) } // clean up AVCapture func stopCamera(){ session.stopRunning() done = false } func convertImageFromCMSampleBufferRef(_ sampleBuffer:CMSampleBuffer) -> CIImage{ let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)! let ciImage:CIImage = CIImage(cvImageBuffer: pixelBuffer) return ciImage } } 

您可以使用mainView的frame替换boxView的frame ,而不要设置其背景属性。 这样,您可以使用此视图添加更多子视图。

重要

请记住,在iOS 10中,您需要首先询问用户是否允许访问摄像头。 您可以通过向应用程序的Info.plist添加使用密钥以及目的字符串来实现此目的,因为如果您未能声明使用情况,您的应用程序将在首次访问时崩溃。

这是一个显示Camera访问请求的屏幕截图

在此处输入图像描述

我希望这可以帮助你!

另一方面,SceneView对于增强现实应用程序非常有用。

  1. 使用AVFramework或UIView创建预览图层,然后将预览图层添加到视图的子图层。
  2. 创建并保存场景视图。 然后将sceneview添加到视图的子视图中。
  3. 创建和优化场景。 最后添加到sceneview的场景。

      // 1. Create a preview layer with AVFramework or UIView, then add preview layer to view's sublayer. self.previewLayer!.frame = view.layer.bounds view.clipsToBounds = true view.layer.addSublayer(self.previewLayer!) // 2. Create and custumize a sceneview. Then add sceneview to view's subview. let sceneView = SCNView() sceneView.frame = view.bounds sceneView.backgroundColor = UIColor.clearColor() self.previewLayer!.frame = view.bounds view.addSubview(sceneView) // 3 . Create and custimize scene. Finally add to scenview's scene. let scene = SCNScene() sceneView.autoenablesDefaultLighting = true sceneView.allowsCameraControl = true let boxGeometry = SCNBox(width: 800 , height: 400, length: 1.0, chamferRadius: 1.0) let yellow = UIColor.yellowColor() let semi = yellow.colorWithAlphaComponent(0.3) boxGeometry.firstMaterial?.diffuse.contents = semi let boxNode = SCNNode(geometry: boxGeometry) scene.rootNode.addChildNode(boxNode) sceneView.scene = scene 

一种简单的方法是在imagepickercontroller上添加叠加视图并隐藏默认视图。

另一种方法是使用AV框架,它将为您提供更多的选择和自由。

选择取决于您的需求。