我實作了一個簡單的相機視圖:
import SwiftUI
import AVFoundation
struct CameraView: View {
@StateObject var model = CameraModel()
var body: some View {
CameraPreview(camera: model).ignoresSafeArea().onAppear() {
model.check()
}
}
}
struct CameraPreview: UIViewRepresentable {
@ObservedObject var camera: CameraModel
func makeUIView(context: Context) -> some UIView {
let view = UIView(frame: UIScreen.main.bounds)
camera.preview = AVCaptureVideoPreviewLayer(session: camera.session)
camera.preview.frame = view.frame
camera.preview.videoGravity = AVLayerVideoGravity.resizeAspectFill
view.layer.addSublayer(camera.preview)
camera.session.startRunning()
return view
}
func updateUIView(_ uiView: UIViewType, context: Context) {
}
}
struct CameraView_Previews: PreviewProvider {
static var previews: some View {
CameraView()
}
}
class CameraModel: ObservableObject {
@Published var session = AVCaptureSession()
@Published var alert = false
@Published var preview: AVCaptureVideoPreviewLayer!
func check() {
switch AVCaptureDevice.authorizationStatus(for: .video) {
case .authorized:
setUp()
break
case .notDetermined:
AVCaptureDevice.requestAccess(for: .video) { (status) in
if status {
self.setUp()
}
}
break
case .denied:
self.alert.toggle()
break
default:
break
}
}
func setUp() {
do {
self.session.beginConfiguration()
let device = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .back)
let input = try AVCaptureDeviceInput(device: device!)
if self.session.canAddInput(input) {
self.session.addInput(input)
}
self.session.commitConfiguration()
}
catch {
print(error.localizedDescription)
}
}
}
并將其顯示為TabView(根層)中的選項卡:
import SwiftUI
struct ContentView: View {
var body: some View {
TabView {
HomeView()
.tabItem {
Image("HomeIcon").renderingMode(.template)
Text("Home")
}
CameraView()
.tabItem {
Image("MapMarkerRadiusIcon").renderingMode(.template)
Text("Camera")
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
不幸的是,CameraView()覆寫了底部的標簽欄:

看起來好嗎?不幸的是,沒有......當我制作螢屏截圖或隱藏應用程式時,它會顯示未選擇的圖示。當應用程式剛剛啟動并Camera打開選項卡時,它如下所示:

如何修復這個錯誤?我需要標簽欄始終位于頂部(如第一個螢屏截圖所示)
uj5u.com熱心網友回復:
如果您想在相機視圖上查看所有選項卡,只有一個解決方法,但它與您在第一個螢屏截圖中顯示的內容不匹配。
要查看所有選項卡,只需在safeAreaInset(edge:alignment:spacing:_:)下方添加修飾符CameraPreview(camera: model)并設定ignoresSafeArea為.top.
這是完整的示例代碼:
CameraPreview(camera: model)
.safeAreaInset(edge: .bottom, alignment: .center, spacing: 0) {
Color.clear
.frame(height: 0)
.background(Material.bar)
}
.ignoresSafeArea(.all, edges: .top)
結果:

希望它能拯救你。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/454098.html
上一篇:如何將函式的回傳值用作onAppear中另一個函式的引數
下一篇:如何解決頁眉和頁腳的間距問題?
