У меня есть собственный NSView, который я хочу напечатать.После настройки с NSView и опциями печати я делаю этот вызов:
NSPrintOperation *printOperation = [NSPrintOperation printOperationWithView: printView printInfo: printInfo];
[NSPrintOperation setCurrentOperation: printOperation];
[printView beginDocument];
NSGraphicsContext* theContext = printOperation.context;
«theContext» всегда равен nil.Если я игнорирую это, когда я делаю этот вызов:
[printView beginPageInRect: rect atPlacement: location];
, я получаю исключение, говоря: «[General] lockFocus / unlockFocus отправлено представлению, которое не находится в окне» *
Если я закомментирую это, я получу около миллиарда сообщений, в которых говорится: «CGContextDrawPath: неверный контекст 0x0. Если вы хотите увидеть обратную трассировку, установите переменную среды CG_CONTEXT_SHOW_BACKTRACE».Включение обратной трассировки просто показывает, что весь мой рисунок вызывает его.
Если я смотрю на графический контекст в функции DrawRect: моего представления:
NSGraphicsContext *graphicsContext = [NSGraphicsContext currentContext];
CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];
и graphicsContext, иcontext is nil.
Итак, что мне нужно сделать, чтобы получить действительный контекст печати?Я вижу, что есть метод NSPrintOperation createContext, но в документах говорится, что он не должен вызываться напрямую, и если я его проигнорирую, это не поможет, и он выводит на принтер около восьми пустых заданий.
Последняя версиякод, который все еще приводит к нулевому контексту:
NSPrintOperation *printOperation = [NSPrintOperation printOperationWithView: printView printInfo: printInfo];
[printView setCurrentForm: [formSet objectAtIndex: 0]];
NSInteger pageCounter = 0;
formHeight = 0;
formWidth = 0;
for (AFVForm *oneForm in formSet)
{
printView.verticalOffset = formHeight;
NSRect rect = NSMakeRect(0, 0, oneForm.pageWidth, oneForm.pageHeight);
NSPoint location = [printView locationOfPrintRect: rect];
formHeight += [oneForm pageHeight];
if ([oneForm pageWidth] > formWidth)
formWidth = [oneForm pageWidth];
pageCounter++;
printView.currentForm = oneForm;
[printView setPrintMode: YES];
[printView drawRect: NSZeroRect];
[printView setPrintMode: NO];
}
[printOperation setShowsPrintPanel:YES];
[printOperation runOperationModalForWindow: [self window] delegate: nil didRunSelector: nil contextInfo: nil];