可可。创建NSTextView,向其添加NSString并打印

时间:2011-08-17 17:52:31

标签: cocoa macos

我有一个带打印收据按钮的窗口。我需要做的是创建一个简单的NSTextView,向它添加一个NSString(至少像“Hello World”)并打印它而不在窗口上显示NSTextView。

以下是我目前的情况:

    NSTextView *textView = [[NSTextView alloc] init];

    NSString *text = @"testing";

    [textView setEditable:true];
    NSRange range = NSMakeRange( 0, [[textView string] length]);
    [textView setSelectedRange:range];
    [[[textView textStorage] mutableString] appendString:text];

    NSPrintOperation *printOperation;

    printOperation = [NSPrintOperation printOperationWithView:textView];


    [printOperation runOperation];

当我运行它时,我看到打印对话框,但预览为空。 当我更改printOperationWithView:textView];从textView到我窗口上的一个现有视图,它打印正常。

最重要的是......单击“打印”按钮后,我不想显示视图。理想情况下,我想打印文本,而不是视图。

4 个答案:

答案 0 :(得分:6)

您是否尝试将-initWithFrame与非零矩形一起使用?

NSTextView *textview = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0, 468, 648);

(468 x 648可使其适合A4纸张,边距为1英寸。)

答案 1 :(得分:2)

这是一个在NSDocument子类中工作的实现。修改它以满足您的需求。

- (NSPrintOperation *)printOperationWithSettings:(NSDictionary<NSString *,id> *)printSettings error:(NSError * _Nullable __autoreleasing *)outError
{
    NSPrintInfo * printInfo = [self printInfo];

    printInfo.topMargin = 15.0;
    printInfo.leftMargin = 10.0;
    printInfo.rightMargin = 10.0;
    printInfo.bottomMargin = 15.0;
    printInfo.verticallyCentered = NO;

    NSRect bounds = printInfo.imageablePageBounds;

    NSTextView * printView = [[NSTextView alloc] initWithFrame:bounds];
    printView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;

    [printView.textStorage appendAttributedString:self.attributedStringRepresentation];

    return [NSPrintOperation printOperationWithView:printView printInfo:printInfo];
}

答案 2 :(得分:0)

您是否尝试过:

[textView print];

答案 3 :(得分:0)

这非常好。再增加一个。为了使打印输出不居中,并正确填充页面,请将printInfo作为参数传递。

NSPrintOperation *printOperation;

NSPrintInfo *pInfo = [[NSPrintInfo alloc] init];
[pInfo setBottomMargin:50];
[pInfo setTopMargin:50];
[pInfo setVerticallyCentered:false];
printOperation = [NSPrintOperation printOperationWithView:textView printInfo:pInfo];

[printOperation runOperation];