【发布时间】:2021-02-12 07:50:18
【问题描述】:
我有一个 SwuftUI 视图,它同时具有导航栏和标签栏。我有一个通过 URL 加载 PDF 的 PDF 查看器。当 PDF 显示在视图中时,它从所需的导航栏下方开始,但它不会填充到选项卡栏的顶部,尽管 pdf 有多页长。我知道我可以使用.frame() 并使视图全高,然后减去两个条的高度,但这似乎效率很低。
必须有一种更简单的方法来做到这一点,计算固定 UI 元素的高度只是为了使视图正确适合似乎非常低效。有没有办法做到这一点,我错过了?
PDFViewer.swift
import SwiftUI
import PDFKit
struct PDFViewer: View {
var url: URL
var body: some View {
PDFKitRepresentedView(url)
.navigationTitle("Payslip")
.navigationBarTitleDisplayMode(.inline)
}
}
struct PDFKitRepresentedView: UIViewRepresentable {
let url: URL
init(_ url: URL) {
self.url = url
}
func makeUIView(context: UIViewRepresentableContext<PDFKitRepresentedView>) -> PDFKitRepresentedView.UIViewType {
let pdfView = PDFView()
pdfView.document = PDFDocument(url: self.url)
pdfView.autoScales = true
return pdfView
}
func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<PDFKitRepresentedView>) {
}
}
ContentView.swift
struct ContentView: View {
@State var userIsAuthenticated: Bool = false
init(auth: State<Bool>) {
navAppearance.configureWithOpaqueBackground()
navAppearance.backgroundColor = UIColor(Color("MyBlue"))
navAppearance.titleTextAttributes = [.foregroundColor: UIColor.white]
navAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white]
UINavigationBar.appearance().standardAppearance = navAppearance
UINavigationBar.appearance().scrollEdgeAppearance = navAppearance
self._userIsAuthenticated = auth
}
var body: some View {
if userIsAuthenticated {
TabView {
NavigationView {
RosterView(auth: $userIsAuthenticated)
}
.navigationViewStyle(StackNavigationViewStyle())
.tabItem { Label("My Roster", systemImage: "calendar") }
NavigationView {
PayView(auth: $userIsAuthenticated)
}
.tabItem { Label("My Pay", systemImage: "dollarsign.circle") }
NavigationView {
LeaveView(auth: $userIsAuthenticated)
}
.tabItem { Label("My Leave", systemImage: "airplane.circle") }
NavigationView {
MessagesView(auth: $userIsAuthenticated)
}
.tabItem { Label("Messages", systemImage: "bubble.left.and.bubble.right") }
}
.foregroundColor(.white)
.accentColor(.white)
.onAppear(perform: {
UITabBar.appearance().isTranslucent = false
UITabBar.appearance().barTintColor = UIColor(named: "MyBlue")
UITabBar.appearance().unselectedItemTintColor = UIColor.lightText
UITabBar.appearance().tintColor = UIColor.white
})
} else {
AuthView(auth: $userIsAuthenticated)
}
}
}
【问题讨论】: