- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
这个问题是关于打印 WKWebView 的所有内容(包括屏幕外内容)。目前(仍然是 iOS 10.2 或 OSX 10.12)没有可行的解决方案,也没有任何假定的解决方案计算器工作。仅当您已自行验证可以打印屏幕外内容时,才在此处提供答案,如果确实如此,则提供工作示例代码。
我正在尝试在 OSX 10.10 或更高版本上打印 ALL WKWebView 或 WebView 的内容(目前在 10.11.2 上运行)。例如,一个宽 html 表格,其中的列在 View 之外并偏向右侧。早期版本的 OSX 会自动分页并正确打印所有 html。
我已经尝试使用 Stackoverflow 和其他地方提供的解决方案。所有本质上都在说同样的事情,就是像这样打印 documentView
:
[[NSPrintOperation printOperationWithView:_webView.mainFrame.frameView.documentView printInfo:pInfo] runOperation];
这在 10.10 中对 WKWebView 或 WebView 停止工作。如果你这样做:
[[NSPrintOperation printOperationWithView:_wkWebView printInfo:pInfo] runOperation];
你得到了分页,但打印输出包括滚动条 WebView
,而另一个 WKWebView
给你空白页。
我在 Apple 文档中找不到任何关于在 OSX 上打印 WKWebView 的内容。我也找不到任何特定于 OSX 而不是 iOS 的答案。
有人知道如何在 OSX 上打印这些吗?
更新:这是 WebView [Radar:23159060](仍然开放 2/2018) 中的一个错误,WKWebView 甚至似乎没有解决 OSX 上的打印问题。在网上检查了此类的开源后,我看到所有 与打印有关的类都在仅支持平台的条件编译 block 中: iOS。
UPDATE Part Deux:令人惊讶的是,这个类的所有实现中都存在这个荒谬的错误,包括 iOS 上的实现!尽管文档声明在支持 iOS 8 或更高版本的应用程序中使用此(且仅此类),但在这么晚的日期,这仍然仍未修复,我觉得这很荒谬。现在不可能在 iOS 或 OSX 上打印 WebView 的所有屏幕上和屏幕外内容。失败的苹果。是时候解决这个问题了!我们都知道史蒂夫会怎么说……
更新第三部分 :)- 更令人惊讶的是,这个问题从 10.15.2 开始并没有得到解决,并且在 4 年多的时间里出现了!!!这个问题一直存在(Apple waaaaaake up up up up up ....)。考虑到他们在 iOS 领域对使用 WKWebView 和以上甚至拒绝不支持的应用程序(除非你试图支持 iOS 7)变得非常有进取心,这真是令人惊讶。
更新第四部分(2020 年......你能相信吗?!?):在大苏尔,这仍然是一个问题。我通过编写解决方案解决了这个问题,请参阅下面接受的答案:
printOperationWithPrintInfo:
不打印屏幕外或在水平或垂直方向上滚出 View 的所有内容。但是,它确实使用了您的 Print CSS,这比以下内容略有优势:
- (void)takeSnapshotWithConfiguration:(WKSnapshotConfiguration *)snapshotConfiguration
completionHandler:(void (^)(NSImage *snapshotImage, NSError *error))completionHandler;
为了让它工作,我做了:
NSPrintInfo *pInfo = [[NSPrintInfo alloc] initWithDictionary:printInfoDict];
pInfo.horizontalPagination = NSPrintingPaginationModeAutomatic;
pInfo.verticalPagination = NSPrintingPaginationModeAutomatic;
pInfo.verticallyCentered = YES;
pInfo.horizontallyCentered = YES;
pInfo.orientation = NSPaperOrientationLandscape;
pInfo.leftMargin = 30;
pInfo.rightMargin = 30;
pInfo.topMargin = 30;
pInfo.bottomMargin = 30;
NSPrintOperation *po = [_webView printOperationWithPrintInfo:pInfo];
po.showsPrintPanel = YES;
po.showsProgressPanel = YES;
// Without the next line you get an exception. Also it seems to
// completely ignore the values in the rect. I tried changing them
// in both x and y direction to include content scrolled off screen.
// It had no effect whatsoever in either direction.
po.view.frame = _webView.bounds;
// [printOperation runOperation] DOES NOT WORK WITH WKWEBVIEW, use
[po runOperationModalForWindow:self.view.window delegate:self didRunSelector:@selector(printOperationDidRun:success:contextInfo:) contextInfo:nil];
**还有一些我不完全理解的事情。 wkWebView 的大小似乎无关紧要。如果我调整应用程序的大小以隐藏某些内容,它似乎仍然会在屏幕外抓取尽可能多的内容以适应指定的页面,但它似乎不知道如何对不适合页面大小的内容进行分页到其他页面。所以这似乎是问题所在。可能有一些解决方法,如果有人有线索,请在此处发布!!
最佳答案
我已经成功地使用了 SPI -[WKWebView _printOperationWithPrintInfo:] 通过了通常的 [NSPrintInfo sharedPrintInfo]。请注意,您不能对返回的 NSPrintOperation 使用 -runOperation。您必须使用 -runOperationModalForWindow:.... 这非常相似。问题出在 WebKit 内部,它需要一个正在运行的 runloop 并在内部进行预览以了解页面数量。
它绝对适用于屏幕外内容,如果屏幕外的意思是“未完全显示在屏幕上”。我仍然有一个 WKWebView 显示在一个窗口中,但它非常小并且只显示整个 webview 内容的一小部分(21 个 A4 页!)。希望这对您有所帮助!
PS:在 10.12、10.14 和 10.15 上测试。代码是这样的:
SEL printSelector = NSSelectorFromString(@"_printOperationWithPrintInfo:"); // This is SPI on WKWebView. Apparently existing since 10.11 ?
NSMutableDictionary *printInfoDict = [[[NSPrintInfo sharedPrintInfo] dictionary] mutableCopy];
printInfoDict[NSPrintJobDisposition] = NSPrintSaveJob; // means you want a PDF file, not printing to a real printer.
printInfoDict[NSPrintJobSavingURL] = [NSURL fileURLWithPath:[@"~/Desktop/wkwebview_print_test.pdf" stringByExpandingTildeInPath]]; // path of the generated pdf file
printInfoDict[NSPrintDetailedErrorReporting] = @YES; // not necessary
// customize the layout of the "printing"
NSPrintInfo *customPrintInfo = [[NSPrintInfo alloc] initWithDictionary:printInfoDict];
[customPrintInfo setHorizontalPagination: NSPrintingPaginationModeAutomatic];
[customPrintInfo setVerticalPagination: NSPrintingPaginationModeAutomatic];
[customPrintInfo setVerticallyCentered:NO];
[customPrintInfo setHorizontallyCentered:NO];
customPrintInfo.leftMargin = 0;
customPrintInfo.rightMargin = 0;
customPrintInfo.topMargin = 5;
customPrintInfo.bottomMargin = 5;
NSPrintOperation *printOperation = (NSPrintOperation*) [_webView performSelector:printSelector withObject:customPrintInfo];
[printOperation setShowsPrintPanel:NO];
[printOperation setShowsProgressPanel:NO];
// BOOL printSuccess = [printOperation runOperation]; // THIS DOES NOT WORK WITH WKWEBVIEW! Use runOperationModalForWindow: instead (asynchronous)
[printOperation runOperationModalForWindow:self.window delegate:self didRunSelector:@selector(printOperationDidRun:success:contextInfo:) contextInfo:nil]; // THIS WILL WORK, but is async
关于ios - 如何打印所有 WKWebView On 和 Offscreen 内容 OSX 和 iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33319295/
我正在为我学校的一个反欺凌计划建立一个网站,我试图包括一个有趣的动画背景。我认为移动的云看起来很酷,所以我将它们应用到背景中。早些时候,我有一个错误,屏幕外的云会拉伸(stretch)页面并在页面底部
我有一个 Canvas 外菜单,他总是在屏幕上,但我的主 div 在他上面,所以,当我单击按钮时,主向右滑动然后你可以看到菜单,好吗?好的。但我有 3 个问题: 当菜单被激活时,页面会自动滚动到顶部,
我有如下问题。我使用 CefSharp offscreen 进行网页自动化,如下所示(我只打开同一个页面):1. 打开页面并等待它呈现*。2. 使用 EvaluateScriptAsync,我将值输入
我想创建一个加载图像的离屏缓冲区。当用户执行更改时,必须在 Offscreen Buffer 中的纹理中完成更改。 最佳答案 您可以使用 UIGraphicsImageRenderer绘制到屏幕外上下
我需要一个例程,可以将一个缓冲区的矩形区域之间的原始 32 位像素 malloc 数据快速复制到另一个缓冲区。 所以...下面是我尝试模拟Apple的drawInRect:fromRect:opera
我正在使用 MVC4、C#、Razor Engine 和 jQuery 制作一个小项目。在我的代码中,我有一个下拉列表,每次在该下拉列表中选择一个项目时,我都想发送一个 Ajax 请求,其中包含所选信
任何人都可以向我展示 CefSharp.OffScreen 浏览器鼠标和键盘事件模拟的示例 (C#)? 对不起我的英语...例如: mouse down on screen x=100,y=100..
我想看看我的应用程序中哪个 View 是离屏渲染的。所以我使用 iOS 模拟器的“颜色离屏渲染”功能,它可以用黄色为那些离屏渲染的 View 着色。但是在应用程序启动后,整个屏幕都是黄色的,我不相信。
我需要一些有关在 Delphi XE2 中将 OpenGL ViewPort 的渲染内容保存到位图文件的帮助。 基本上,我想要做的事情是在完成一些渲染后,将 FrameBuffer 的内容转储到位图(
我正在构建一个类似消息传递的应用程序,但我遇到了键盘推送内容错误的问题。 我想要的是内容向上推的高度与键盘的高度一样,并且我能够自由地向上滚动以查看之前的所有消息。就像大多数消息应用程序一样。 这是我
当有人离开页面但没有查看它时,是否有办法暂停长轮询脚本?因此,如果我打开应用程序的多个选项卡或窗口,只有我正在查看的那个才会运行事件的长轮询脚本? 最佳答案 实际上,在 javascript 中没有暂
我正在尝试使用帧缓冲区来离屏渲染立方体。然后我尝试使用它的纹理将它转换为纹理。我遇到的问题是当我尝试将该纹理放在平面上时。纹理颜色完全基于一种原色:芦苇、绿色或蓝色。我不知道问题出在哪里,也许是从 f
我正在尝试使用 JavaScript 模拟 CefSharp(OffScreen) 上的用户操作。 一旦我加载页面 ( https://www.w3.org ), 我正在尝试在搜索栏中搜索, 点击搜索
我希望在单独的线程中使用 OpenGL 渲染到屏幕外缓冲区。我不需要与主线程共享上下文。以前,我在 Qt 5.4 中使用 QOpenGLContext 类,我在主线程中初始化它,然后使用它的 move
我的任务很简单,但需要精通 CefSharp 的人才能解决。 我有一个 url,我想从中检索 HTML。问题是这个特定的 url 实际上并没有在 GET 上分发页面。相反,它将一堆 Javascrip
有一个有趣的浏览器框架叫做Awesomium ,它基本上是 Chromium 浏览器引擎的包装器。 我有兴趣使用它为桌面重新分发基于 WebGL 的游戏。然而 Awesomium 只支持使用发送到 C
我有兴趣打印一些不属于 View 层次结构的 MKMapViews,并且仅在用户点击“打印”时创建。 似乎以下几点是正确的: Offscreen MKMapViews 根本不渲染。 打印 MKMapV
我正在尝试为我的 Cocoa(Mac,而不是 iOS)应用程序创建自定义颜色选择器,但遇到了一些麻烦。我对计算机图形和绘图的各种模式非常熟悉,但我对 Cocoa 很陌生,我认为问题基本上是在其多层图形
所以我想让每个输入框都有一定的大小,有人告诉我必须为每个输入框创建一个新行才能做到这一点。一般来说,我对 Bootstrap 和编码还很陌生,所以我不确定如何解决这个问题。 如果版本很重要,我正在使用
我有 2+ 遍渲染,其中第一阶段生成矩形网格的顶点位置并将它们存储在 2D 浮点纹理中。着色器看起来像这样: 顶点: #version 330 core out vec2 vfTexCoords; c
我是一名优秀的程序员,十分优秀!