栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何将实时摄像机预览添加到UIView

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何将实时摄像机预览添加到UIView

更新为SWIFT 5
您可以尝试如下操作:

import UIKitimport AVFoundationclass 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 methodsextension 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以及目的字符串来完成此操作,
因为如果您未能声明用途,则应用程序在首次
进行访问时将崩溃。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/649718.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号