如何让 AVFoundation 预览视图在 SwiftUI 中占据所有屏幕,而忽略安全区域? [英] How to make the AVFoundation Preview View to occupy all screen in SwiftUI, disregarding the safe area?

查看:35
本文介绍了如何让 AVFoundation 预览视图在 SwiftUI 中占据所有屏幕,而忽略安全区域?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用此代码

import SwiftUI
import UIKit
import AVFoundation

class PreviewView: UIView {
    private var captureSession: AVCaptureSession?

    init() {
        super.init(frame: .zero)

        var allowedAccess = false
        let blocker = DispatchGroup()
        blocker.enter()
        AVCaptureDevice.requestAccess(for: .video) { flag in
            allowedAccess = flag
            blocker.leave()
        }
        blocker.wait()

        if !allowedAccess {
            print("!!! NO ACCESS TO CAMERA")
            return
        }

        // setup session
        let session = AVCaptureSession()
        session.beginConfiguration()

        let videoDevice = AVCaptureDevice.default(.builtInWideAngleCamera,
            for: .video, position: .unspecified) //alternate AVCaptureDevice.default(for: .video)
        guard videoDevice != nil, let videoDeviceInput = try? AVCaptureDeviceInput(device: videoDevice!), session.canAddInput(videoDeviceInput) else {
            print("!!! NO CAMERA DETECTED")
            return
        }
        session.addInput(videoDeviceInput)
        session.commitConfiguration()
        self.captureSession = session
    }

    override class var layerClass: AnyClass {
        AVCaptureVideoPreviewLayer.self
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    var videoPreviewLayer: AVCaptureVideoPreviewLayer {
        return layer as! AVCaptureVideoPreviewLayer
    }

    override func didMoveToSuperview() {
        super.didMoveToSuperview()

        if nil != self.superview {
            self.videoPreviewLayer.session = self.captureSession
            self.videoPreviewLayer.videoGravity = .resizeAspect
            self.captureSession?.startRunning()
        } else {
            self.captureSession?.stopRunning()
        }
    }
}

struct PreviewHolder: UIViewRepresentable {
    func makeUIView(context: UIViewRepresentableContext<PreviewHolder>) -> PreviewView {
        PreviewView()
    }

    func updateUIView(_ uiView: PreviewView, context: UIViewRepresentableContext<PreviewHolder>) {
    }

    typealias UIViewType = PreviewView
}

struct DemoVideoStreaming: View {
    var body: some View {
        VStack {
            PreviewHolder()
        }.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .center)
    }
}

在 SwiftUI 上实现 AVFoundation 相机.

to implement the AVFoundation camera on SwiftUI.

这很完美,但我希望预览视图填满所有 iPhone 屏幕区域,不考虑安全区域.

This works perfectly but I want the preview view to fill all iPhone screen area, disregarding the safe area.

我对 SwiftUI 很陌生.

I am very new to SwiftUI.

我已经尝试了所有常见的嫌疑犯,比如在 DemoVideoStreaming 的主体上使用 .edgesIgnoringSafeArea(.all).

I have tried all regular suspects like using .edgesIgnoringSafeArea(.all) on the body of DemoVideoStreaming.

有什么想法吗?

推荐答案

将视频重力改为 .resizeAspectFill

self.videoPreviewLayer.videoGravity = .resizeAspectFill

这篇关于如何让 AVFoundation 预览视图在 SwiftUI 中占据所有屏幕,而忽略安全区域?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆