как настроить вид камеры в swift5? - PullRequest
0 голосов
/ 31 октября 2019

Я хочу перенастроить cameraScreen на тот, который хочу. На данный момент у меня нет кнопок кроме cameraScreen.

Конечно, это успешно завершает QRcode распознавание. Но я хочу добавить NavigationHeaders и Text и Button в cameraScreen.

Как вы можете решить эту проблему?

текущая камера Экранный код

import Foundation
import UIKit
import AVFoundation


class QRViewController : UIViewController, AVCaptureMetadataOutputObjectsDelegate {

    var captureSession: AVCaptureSession!
    var previewLayer: AVCaptureVideoPreviewLayer!

    @IBOutlet weak var headerBar: UINavigationBar!
    @IBOutlet weak var cameraText: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = UIColor.black
        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)
        captureSession.startRunning()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        if (captureSession?.isRunning == false) {
            captureSession.startRunning()
        }
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        if (captureSession?.isRunning == true) {
            captureSession.stopRunning()
        }
    }


    override var prefersStatusBarHidden: Bool {
        return true 
    }


    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }


    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
        captureSession.stopRunning()

        if let metadataObject = metadataObjects.first {
            guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return }
            guard let stringValue = readableObject.stringValue else { return }
            AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
            found(code: stringValue)
        }

        self.dismiss(animated: true, completion: nil)
    }


    func found(code: String) {
           print(code)
    }

    func failed() {
        captureSession = nil
    }

Текущая основная часть экрана камерыBoard

enter image description here

Текущий экран камеры

enter image description here

Что я хочу на экране

enter image description here

Мне нужно ваше решение

Редактировать

Я пыталсячтобы решить проблему в квадратных областях, но не хватает понимания ответов на проблему. Дополнения к квадратным областям следующие:

override func viewDidLoad() {
        super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: Selector(("avCaptureInputPortFormatDescriptionDidChangeNotification:")), name:NSNotification.Name.AVCaptureInputPortFormatDescriptionDidChange, object: nil)
}
...
    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
        let scanRect = CGRect(x: 0, y: 0, width: 200, height: 200)
        let rectOfInterest = layer.metadataOutputRectConverted(fromLayerRect: scanRect)
        metadataObjects.rectOfInterest = rectOfInterest
        ...

Я добавил это, но есть ошибка.

Использование неразрешенного идентификатора 'layer'

Есть ли еще код, кроме того, который я только что добавил?

Как вы должны исправить эту ошибку

1 Ответ

0 голосов
/ 31 октября 2019

view.layer.insertSublayer(previewLayer, at: 0) вместо view.layer.addSublayer(previewLayer), это вставит слой предварительного просмотра ниже всего остального, и вы сможете увидеть ваши компоненты пользовательского интерфейса.

управление вспышкой

сканировать только информацию внутри прямоугольника

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...