本文介绍了WKWebKit Mac OS NSPrintOperation的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

WebKit 1公开了WebFrameView,我可以在其中调用打印操作.

WebKit 1 exposed the WebFrameView where I could call a print operation.

- (void)webView:(WebView *)sender printFrameView:(WebFrameView *)frameView {
  NSPrintOperation *printOperation = [frameView printOperationWithPrintInfo:[NSPrintInfo sharedPrintInfo]];
  [printOperation runOperation];
}

使用WKWebKit API,我似乎无法弄清楚如何执行类似的操作或要抓取哪个视图进行打印.我所有的努力都拿出空白页.

With WKWebKit API I can't seem to figure out how to perform a similar action or which view to grab for printing. All my efforts have come up with blank pages.

推荐答案

令人惊讶的是,尽管不推荐使用旧版WebView,但WKWebView仍然不支持在macOS上进行打印.

Amazingly, WKWebView still doesn't support printing on macOS, despite the legacy WebView being deprecated.

查看 https://github.com/WebKit/webkit/webkit/commit/0dfc67a174b79a8a401cf6f60 a>,打印是在几年前作为私有API实施的,但由于某些原因尚未公开.如果您不介意使用私有API,则可以使用以下命令打印WKWebView:

public extension WKWebView {
    // standard printing doesn't work for WKWebView; see http://www.openradar.me/23649229 and https://bugs.webkit.org/show_bug.cgi?id=151276
    @available(OSX, deprecated: 10.16, message: "WKWebView printing will hopefully get fixed someday – maybe in 10.16?")
    private static let webViewPrintSelector = Selector(("_printOperationWithPrintInfo:")) // https://github.com/WebKit/webkit/commit/0dfc67a174b79a8a401cf6f60c02150ba27334e5


    func webViewPrintOperation(withSettings printSettings: [NSPrintInfo.AttributeKey : Any]) -> NSPrintOperation? {
        guard self.responds(to: Self.webViewPrintSelector) else {
            return nil
        }

        guard let po: NSPrintOperation = self.perform(Self.webViewPrintSelector, with: NSPrintInfo(dictionary: printSettings))?.takeUnretainedValue() as? NSPrintOperation else {
            return nil
        }

        // without initializing the print view's frame we get the breakpoint at AppKitBreakInDebugger:
        // ERROR: The NSPrintOperation view's frame was not initialized properly before knowsPageRange: returned. This will fail in a future release! (WKPrintingView)
        po.view?.frame = self.bounds

        return po
    }
}

您可以通过添加以下内容将此作为NSDocument子类的默认打印操作:

You can have this be the default print operation for your NSDocument subclass by adding:

    override func printOperation(withSettings printSettings: [NSPrintInfo.AttributeKey : Any]) throws -> NSPrintOperation {
        return myWebView.webViewPrintOperation(withSettings: printSettings) ?? try super.printOperation(withSettings: printSettings)
    }

这篇关于WKWebKit Mac OS NSPrintOperation的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!