1

我有一个使用 Vision 的条形码扫描仪,效果很好。如何让相机与我的 VStack 配合得很好?目前,当我添加 cameraView 时,cameraView 不能很好地与 VStack 配合使用,这意味着它被添加为我必须用来显示相机的 AVCaptureVideoPreviewLayer 帧。

我怎样才能使它与 VStack 一起工作,以便更容易修改?

struct BarcodeScannerView: View {
    
    var pitchDegrees: CGFloat
    
    var cameraView = CameraView()
    
    var body: some View {
        
        VStack(spacing: 20) {
        
            Rectangle()
                .frame(width: 40, height: 5)
                .cornerRadius(3)


            Text("Barcode Scanner")
                .multilineTextAlignment(.center)
                .font(.body)
            
            Spacer()
            
            cameraView
                
            Spacer()
            
            Button(action: {
                print("Scan")
            }, label: {
                Text("Scan")
            })
            
            .frame(width: 200, height: 44)
            .background(Color.black)
            .foregroundColor(Color.white)
            .clipShape(Rectangle())
       
        }//VStack
        .frame(maxWidth: .infinity)
        .frame(height: 300)
        .padding()
        .background(Color("Warm White"))
        .clipShape(Rectangle())
        .shadow(radius: 5)
        .padding(.all, 5.0)
        
    }//body
}

相机视图

import Foundation
import SwiftUI

struct CameraView: UIViewControllerRepresentable {
    
    typealias UIViewControllerType = CameraViewController
    
    private let cameraViewController: CameraViewController
    
    init() {
        
        cameraViewController = CameraViewController()
        
    }//init
    
    func makeUIViewController(context: Context) -> CameraViewController {
        
        cameraViewController
        
    }//makeUIViewController
    
    func updateUIViewController(_ uiViewController: CameraViewController, context: Context) {

    }//updateUIViewController
        
}//struct

相机视图控制器

class CameraViewController: UIViewController {

...

    func setupPreview() {
        
        previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        
        previewLayer.videoGravity = .resizeAspectFill
        previewLayer.connection?.videoOrientation = .portrait
        previewLayer.frame = CGRect(x: 0, y: 0, width: view.frame.width - 30, height: 200)
        previewLayer.cornerRadius = 15.0
        previewLayer.borderWidth = 1
        previewLayer.borderColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)
        previewLayer.shadowRadius = 5.0
        
        view.layer.addSublayer(previewLayer)
    
    }//setupPreview

...
}
4

0 回答 0