作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
试图找出如何在 iOS 和 macOS 上的 SwiftUI 中使用 QuickLook。我怀疑在遥远的将来,会有一些统一的 SwiftUI QL API,但目前还看不到,所以让我们利用现有的东西吧……
如何从我的 SwiftUI View 中呈现和配置 QLPreviewPanel?到目前为止,我有这个:
struct ItemView: View {
let previewPanelThing = PreviewPanelThing()
var body: some View {
Button("OSX preview") {
print("osx preview")
if let previewPanel = QLPreviewPanel.shared() {
self.previewPanelThing.updateControllerForPanel(previewPanel)
previewPanel.makeKeyAndOrderFront(self.previewPanelThing)
}
}
}
}
class PreviewPanelThing: QLPreviewPanelDataSource {
func updateControllerForPanel(_ panel: QLPreviewPanel) {
print("updating controller")
panel.updateController()
}
func numberOfPreviewItems(in panel: QLPreviewPanel!) -> Int {
print("number of items")
return 1
}
func previewPanel(_ panel: QLPreviewPanel!, previewItemAt index: Int) -> QLPreviewItem! {
print("requesting preview item")
let fileURL: URL = Bundle.main.url(forResource: "Thinking-of-getting-a-cat", withExtension: "png")!
return fileURL as QLPreviewItem
}
}
这是行不通的。我怀疑这是因为 QLPreviewPanel 文档说:预览面板遵循响应者链并适应愿意控制它的第一响应者。
我的 previewPanelThing
实例不在UI 和响应链。我不确定响应链在 SwiftUI 中是如何工作的以及如何最好地处理它。
最佳答案
这里是使用QLPreviewView
直接预览 PDF 文件的可能方法(在这个演示中存储在主应用程序包中,但这不会改变常见的想法)
更新:在按钮点击时添加了带有 QLPreviewPanel
的变体
import SwiftUI
import AppKit
import Quartz
func loadPreviewItem(with name: String) -> NSURL {
let file = name.components(separatedBy: ".")
let path = Bundle.main.path(forResource: file.first!, ofType: file.last!)
let url = NSURL(fileURLWithPath: path!)
return url
}
struct MyPreview: NSViewRepresentable {
var fileName: String
func makeNSView(context: NSViewRepresentableContext<MyPreview>) -> QLPreviewView {
let preview = QLPreviewView(frame: .zero, style: .normal)
preview?.autostarts = true
preview?.previewItem = loadPreviewItem(with: fileName) as QLPreviewItem
return preview ?? QLPreviewView()
}
func updateNSView(_ nsView: QLPreviewView, context: NSViewRepresentableContext<MyPreview>) {
}
typealias NSViewType = QLPreviewView
}
struct ContentView: View {
let qlCoordinator = QLCoordinator()
var body: some View {
// example.pdf is expected in app bundle resources
VStack {
MyPreview(fileName: "example.pdf")
Divider()
Button("Show panel") {
let panel = QLPreviewPanel.shared()
panel?.center()
panel?.dataSource = self.qlCoordinator
panel?.makeKeyAndOrderFront(nil)
}
}
}
class QLCoordinator: NSObject, QLPreviewPanelDataSource {
func previewPanel(_ panel: QLPreviewPanel!, previewItemAt index: Int) -> QLPreviewItem! {
return loadPreviewItem(with: "example.pdf") as QLPreviewItem
}
func numberOfPreviewItems(in controller: QLPreviewPanel) -> Int {
return 1
}
}
}
关于swiftui - 如何在 macOS 上使用 SwiftUI 显示 QLPreviewPanel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59696367/
我是一名优秀的程序员,十分优秀!