2010-03-13 3 views
3

Первоначально я создал простую программу с пользовательским NSView. Я нарисовал фотографию (сертификат) и распечатал ее! красивая! Все отлично поработало!Печать невидимого NSView

Затем я перевел свой пользовательский NSView в существующее приложение. Я надеюсь, что когда пользователь ударит печать, он распечатает этот сертификат. Достаточно просто. Я понял, что у меня может быть указатель NSView в моем коде контроллера. Тогда при инициализации я бы заполнил указатель. Затем, когда кто-то захочет распечатать сертификат, он будет печатать. Проблема в том, что весь мой код рисования находится в методе «drawRect». Этот метод не вызывается, потому что это представление никогда не отображается в окне.

Я слышал, что другие используют невидимые объекты NSView только для печати. Что мне нужно сделать? Я действительно не хочу показывать это представление на экране.

Rodger

ответ

2

Вы не должны создать представление заранее, вы можете создать его при необходимости.

Если у вас есть приложение Document Based и вид, что вы хотите сбросить на принтер, то в нашем MyDocument (или что вы называете это), что расширяет NSDocument вы бы реализовать:

- (NSPrintOperation *)printOperationWithSettings:(NSDictionary *)ps 
              error:(NSError **)e 

Точка зрения затем использует стандарт drawRect: для рисования.

Пример, здесь PeopleView просто рисует table людей, деталей, она занимает NSDictonary людей employees здесь:

- (NSPrintOperation *)printOperationWithSettings:(NSDictionary *)ps 
              error:(NSError **)e 
{ 
    PeopleView * view = [[PeopleView alloc] initWithPeople:employees]; 
    NSPrintInfo * printInfo = [self printInfo]; 
    NSPrintOperation * printOp 
     = [NSPrintOperation printOperationWithView:view 
             printInfo:printInfo]; 
    [view release]; 
    return printOp; 
} 

Вы можете посмотреть более подробную информацию в главе 27, Печать, в Hillegass' Какао Программирование для Mac OS X.

+0

Вам не нужно устанавливать рамку вида? Или печать делает это для вас? –

+0

Нет, это все, что вам нужно сделать, если у вас есть представление, которое может нарисовать себя. Я создал пример, и он работает. Я использую данные по-разному, и когда я хочу их печатать, я использую «PeopleView». – stefanB

0

Это мой код ...

 
- (NSPrintOperation *)printOperationWithSettings:(NSDictionary *)ps error:(NSError **)e 
{ 
    NSLog(@"MyDoc printOp"); 
    StretchView * view = [[StretchView alloc] init]; 
    NSPrintInfo * printInfo = [self printInfo]; 
    NSPrintOperation * printOp 
    = [NSPrintOperation printOperationWithView:view 
            printInfo:printInfo]; 
    [view release]; 
    return printOp; 
} 

Это мой журнал ...

 
unning… 
2010-03-15 10:10:42.251 spelling_tutor[6772:a0b] MyDoc printOp 

У меня есть запись nslog в розыгрыше. Как вы можете видеть, это никогда не называется. Что дает.

+0

Я понял свою ошибку. Это было с инициализацией. У меня была только одна процедура инициализации, которая требовала от них. Если вы посмотрите выше, я ничего не дал. Я изменил свой код выше, чтобы инициализировать NSRec, а затем передать его StretchView. После этого был вызван мой код рисования. –