我的应用程序需要打印一些东西布局应该有点动态(有时特定字段可能包含更多数据,这可能要求它们包含文字或其他类似的东西),但打印输出应该永远不会超过单个页面.如果数据太多,我想稍微减小字体大小并再试一次,然后重复一遍,直到所有内容都适合单个页面(数据永远不会太多,以至于字体不会太小).
我需要在同一页面上打印文本和图像.
布局应如下所示:
+------------------------------------------------------------------+
| +------+ +-------+ |
| | seal | text field 1 | photo | |
| | | text field 2 | | |
| +------+ +-------+ |
| ---------------------------------------------------------------- |
| text header 1: text data |
| text header 2: longer text data |
| text header 3 with long title: very long text data which does |
| not fit on a single line |
| ---------------------------------------------------------------- |
| text header 4: text data |
. .
. (...) (...) .
. .
| |
+------------------------------------------------------------------+
文本字段1的数据略有变化,但不重要.文本字段2的数据可以相当短,但也可以非常长,并且应该适合两个图像元素之间,必要时进行文字包装.这两个字段应该(大致)在两个图像之间垂直居中.
页面其余部分的数据字段按其间的垂直线分组,但所有数据字段应从页面左侧的相同偏移量开始,该偏移量由最长标题的长度定义.
我已经在我的XIB文件中使用独立的NSView(独立式,不是窗口的一部分)来部分管理.我创建了NSTextField元素来保存标题和数据.对齐要求被定义为NSTextField元素的约束,如果一切都适合(即,不需要自动换行,并且不需要减小字体大小),它看起来就像它应该的样式.
但是,还有一些问题:
>我无法弄清楚如何使NSTextField包装其文本,但保持尽可能小,垂直,以适应一切.看起来我需要使它超过一行高(这会导致行之间不需要的空白空间),或者自动换行会遮挡第二行.
>在我知道页面上的可打印区域之前,打印API要求我传递NSView.因此,我没有看到我调整NSView大小的选项,因此它最适合页面.目前,这会导致页面边缘过大或顶部/底部边缘过大,具体取决于所使用的打印机及其设置.
我是以正确的方式来做这件事的吗?如果是这样,我该如何解决上述两个问题?如果没有,我应该做什么呢?
我确实看过Core Printing API,但这似乎有点太低了.
谢谢,
最佳答案 如果将“行为”设置为“无”或“可选”,则NSTextField将换行并且将足够高.
要调整打印视图的大小,可以创建NSView的子类并实现knowsPageRange:和rectForPage:.在knowsPageRange中:您计算页数(1)并返回YES.在rectForPage中:您设置高度和宽度约束,以便视图与页面大小相同,调用[self layoutSubtreeIfNeeded]并返回self.bounds. [[NSPrintOperation currentOperation] printInfo]会给你printinfo.