gpt4 book ai didi

cocoa - 这是在 Cocoa 中实现缩放打印的正确方法吗?

转载 作者:行者123 更新时间:2023-12-03 16:14:56 25 4
gpt4 key购买 nike

我正在尝试在我的新 Cocoa 应用程序中实现打印。除了缩放(即以 75%、125% 等打印)之外,一切都工作正常一段时间了。

据我从 Apple 文档中得知,程序应该根据比例因子调整从 rectForPage: 方法返回的矩形。我发现了一些似乎可以以这种方式工作的示例 Apple 代码,以及 cocoabuilder 上的旧帖子。

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Printing/osxp_pagination/osxp_pagination.html

http://www.cocoabuilder.com/archive/cocoa/211683-scaled-printing.html

我的 rectForPage: 代码如下所示:

NSPrintInfo *pi = [[NSPrintOperation currentOperation] printInfo];
NSSize paperSize = [pi paperSize]; // Calculate the page dimensions in points
// Convert dimensions to the scaled view
CGFloat pageScale = [[[pi dictionary] objectForKey:NSPrintScalingFactor] floatValue];
CGFloat topMargin = [pi topMargin];
CGFloat leftMargin = [pi leftMargin];
CGFloat bottomMargin = [pi bottomMargin];
CGFloat rightMargin = [pi rightMargin];
CGFloat pageHeight = (paperSize.height - topMargin - bottomMargin) / pageScale;
CGFloat pageWidth = (paperSize.width - leftMargin - rightMargin) / pageScale;
NSRect bounds = [self bounds];
NSRect actualPageRect = NSMakeRect(
NSMinX(bounds),
NSMinY(bounds),
pageWidth * pageScale,
pageHeight * pageScale);

return actualPageRect;

但是,我无法让它正常工作。无论此方法返回什么大小的矩形,输出始终以 100% 打印。我确实验证了实际页面矩形会根据比例设置而变化,并且打印输出将裁剪到指定的矩形,但它不会缩放。我本来以为苹果会根据比例因子来缩放 View ,但事实并非如此。

经过长时间的研究,我放弃了这个方法,并尝试了另一种方法。现在我有 rectForPage: 始终返回实际页面大小,并且我更改了 drawRect: 以使用仿射变换绘制缩放输出:

- (void)drawRect:(NSRect)dirtyRect
{
[super drawRect:dirtyRect];
NSAffineTransform* xform = [NSAffineTransform transform];
[xform scaleXBy:pageScale yBy:pageScale];
[xform concat];
[self layoutReport];
[xform invert];
[xform concat];
}

我还修改了knowPageRange:方法以考虑缩放。

结果是——这有效。该程序现在可以生成我想要的任何缩放输出,并且它可以正确分页。但我很确定这是错误的解决方案。我认为一定有一些我遗漏的细节,可以通过缩放从 rectForPage: 返回的矩形来正确缩放,但我在这一点上感到困惑。既然它有效,我可以保留它,但如果这不是正确的方法,我宁愿修复它。

最佳答案

让我们从 rectForPage: 的定义开始,来自 the documentation :

Implemented by subclasses to determine the portion of the view to be printed for the page number page.

A rectangle defining the region of the view to be printed for pageNumber. This method returns NSZeroRect if pageNumber is outside the view’s bounds.

所以这些是裁剪矩形。无论您绘制什么,都会被裁剪到该矩形,并且该绘制将被视为该页面的内容。 (您可能也会在drawRect:中得到该矩形,并期望您会跳过在其之外绘制任何内容。)这些矩形位于两个边界单位中(即,与 self.bounds 相同的单位)和现实世界的单位(默认为 1/72 英寸)。

那么,打印信息的 scalingFactor 又如何呢?

据我所知,从 10.12.6 开始,AppKit 尚未为您应用它 - 您必须自己检索和使用 scalingFactor。 (我可能会遗漏一些东西。)

drawRect:中缩放绘图是一种完全合理的方法。您的页面矩形将保持不变;您在其中的绘图将被缩放。如果 scalingFactor 为 2,您的绘图将加倍,并且页面矩形内将有四分之一(每个轴上的 1/2)。

由于页面矩形采用边界单位,因此缩放边界(使用 setBoundsSize:scaleUnitSquareToSize:)是另一种方法。然后您的绘图和页面矩形将一致缩放。问题是这适用于屏幕绘图和打印绘图。当您有单独的 View 或 View 层次结构用于打印时,它最有意义。

因此,根据引用文档(以及我在 10.12.6 上的实验),我认为您是对的。

至于文档中的示例,我认为它是为 TextEdit 的页面 View 之类的内容编写的,其中边距是 View 绘图的一部分(请注意,它裁剪了 topMarginbottomMargin,例如)。也就是说,我建议您file a bug任何时候您发现示例代码似乎错误、不清楚或建立在未声明的假设之上。

关于cocoa - 这是在 Cocoa 中实现缩放打印的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46065347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com