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