【问题标题】:SwiftUI PDF Kit not filling available view spaceSwiftUI PDF Kit 未填充可用视图空间
【发布时间】: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)
        }
    }
}

【问题讨论】:

    标签: pdf swiftui


    【解决方案1】:

    您的代码的另一部分有问题。如果我按以下方式测试您的代码,则 PDFViewer 的框架是正确的。

    struct ContentView: View {
        private var url: URL {
            guard let localURL = Bundle.main.url(forResource: "A Sample PDF",
                                                 withExtension: "pdf")
            else {
                fatalError()
            }
            return localURL
        }
    
        var body: some View {
            TabView {
                NavigationView {
                    PDFViewer(url: self.url)
                }
                .tabItem {
                    VStack {
                        Image(systemName: "folder")
                        Text("Test")
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 你是对的。我的列表视图之一正在执行与 PDFKit 无关的相同行为,因此我必须进行一些挖掘
    • 刚刚检查并从视图中删除了所有 .frame() 调整,所有这些调整都以这种方式运行。我已经尝试在NavigationView 中使用TabView 进行嵌套,这解决了问题,所有列表都达到了完整高度,但这会导致我无法设置导航属性的问题,因为TabView 是子对象。我已将ContentView.swift 添加到原始问题中。
    • 找到了。 UITabBar.appearance().isTranslucent = false 出于某种原因导致了这种行为。我很确定这不是预期的行为
    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    相关资源
    最近更新 更多