显示摄像头视图的ImageView“在顶部”

时间:2019-07-16 14:23:45

标签: ios swift xcode

我有一个iOS应用程序,该应用程序使用相机扫描条形码,就此而言,一切正常。但是我想在屏幕上放置一个虚线矩形,以供用户“瞄准”相机。 当我在模拟器中运行应用程序时,矩形显示的很好,但是当我在设备上运行时,看不到矩形。 我已经尝试过BringSubviewToFront方法,但似乎无法在设备上正常工作。

以下代码位于ViewDidLoad中:

 // Draw a rectangle for aiming the camera
        let renderer = UIGraphicsImageRenderer(size:CGSize(width:500, height: 200))

        let img = renderer.image {ctx in
            ctx.cgContext.setFillColor(UIColor.clear.cgColor)
            ctx.cgContext.setStrokeColor(UIColor.red.cgColor)
            ctx.cgContext.setLineWidth(7)

            // Make it a dashed line - comment out for a solid line
            ctx.cgContext.setLineDash(phase:0, lengths: [20])

            let rectangle = CGRect(x: 0, y: 0, width: 500, height: 200)
            ctx.cgContext.addRect(rectangle)
            ctx.cgContext.drawPath(using: .fillStroke)
        }

        // Create an imageView to hold the rectangle image
        let myImageView = UIImageView(image: img)
        myImageView.frame = CGRect(x: 147, y: 298, width: 500, height: 250)
        myImageView.layer.cornerRadius = 7

        cameraView.addSubview(myImageView)

        // Add constraints using an extension
        myImageView.anchor(top: cameraView.topAnchor,
                           leading: cameraView.leadingAnchor,
                           bottom: cameraView.bottomAnchor,
                           trailing: cameraView.trailingAnchor,
                           padding: .init(top: 250, left: 100, bottom: 250, right: 100),
                           size: .init(width: 500, height: 250))

        // Bring the rectangle to the front
        cameraView.bringSubviewToFront(myImageView)

1 个答案:

答案 0 :(得分:0)

如果要为captureSession添加图像,则需要创建

AVCaptureVideoPreviewLayer

否则,如果您需要致电相机服务来拍摄 ,就不能这样做。

首先创建变量和视图

var captureSession: AVCaptureSession!
        var previewLayer: AVCaptureVideoPreviewLayer!

        let overlay: UIImageView = {
            let overlay = UIImageView(frame: CGRect.zero)
            overlay.image = UIImage(named: "makedCamera")
            overlay.contentMode = UIView.ContentMode.scaleToFill
            overlay.translatesAutoresizingMaskIntoConstraints = false
            return overlay
        }()

完成所有捕获会话代码后

previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        previewLayer.frame = view.layer.bounds
        previewLayer.videoGravity = .resizeAspectFill
        view.layer.addSublayer(previewLayer)
        view.addSubview(overlay)

        NSLayoutConstraint.activate([
            overlay.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
            overlay.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            overlay.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            overlay.leadingAnchor.constraint(equalTo: view.leadingAnchor)
            ])

        captureSession.startRunning()

简单地 叠加层就是图片

view.layer.addSublayer(previewLayer)
        view.addSubview(overlay)

完整代码:

{
        super.viewDidLoad()

        view.backgroundColor = UIColor.white
        self.title = ""

        captureSession = AVCaptureSession()

        guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else { return }
        let videoInput: AVCaptureDeviceInput

        do {
            videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
        } catch {
            return
        }

        if (captureSession.canAddInput(videoInput)) {
            captureSession.addInput(videoInput)
        } else {
            failed()
            return
        }

        let metadataOutput = AVCaptureMetadataOutput()

        if (captureSession.canAddOutput(metadataOutput)) {
            captureSession.addOutput(metadataOutput)

            metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
            metadataOutput.metadataObjectTypes = [.qr]
        } else {
            failed()
            return
        }

        previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        previewLayer.frame = view.layer.bounds
        previewLayer.videoGravity = .resizeAspectFill
        view.layer.addSublayer(previewLayer)
        view.addSubview(overlay)

        NSLayoutConstraint.activate([
            overlay.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
            overlay.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            overlay.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            overlay.leadingAnchor.constraint(equalTo: view.leadingAnchor)
            ])

        captureSession.startRunning()
    }