NSView Device Auflösung und Drucken

6 views
Skip to first unread message

Torsten Curdt

unread,
Oct 5, 2011, 12:16:14 PM10/5/11
to cocoaheads...@googlegroups.com
Nach seinem Vortrag sind das hier eigentlich ein paar Fragen für Frank.
Vielleicht interessiert es aber auch sonst noch jemanden - deswegen
frage ich einfach mal bei uns auf der Liste.

Ich arbeite gerade an einer Mac App. Wichtiger Bestandteil ist eine
Custom View. Diese View verhält sich ein bisschen so wie iCal. Es gibt
mehrere Spalten und beim Ändern der Window Größe verändern sich die
Breite der Spalten. Die View nimmt die ganze Breite ein. Nun gibt es
einmal natürlich die Probleme die Frank ja im Vortrag gut dargestellt
hast. Also erst einmal die Frage: Frank, gibt es die Folien und/oder
Code schon irgendwo?

Bei der anderen Frage geht es ums Drucken. Man kann die View sehr
breit ziehen. Wenn man dann druckt wird einfach der rechte Rand
abgeschnitten. Bei einem kleinen Window passt es. Nicht sonderlich
verwunderlich. Aber ich frage mich gerade wie ich es hinbekomme das
Drucken von der Window/View Größe zu trennen. Die View sollte
(zumindest in der Breite) immer auf ein Blatt passen.

Eigentlich bräuchte ich noch einen weiter Faktor bei der Konvertierung
von den User auf die Device Koordinaten so, dass die View immer genau
auf eine Seite passt. Wüsste aber gerade nicht so recht wie ich das
einbauen sollte. Dann hab ich im Netz noch diesen Code Schnipsel
gefunden

@implementation MyView

- (BOOL)knowsPageRange:(NSRangePointer)range
{
range->location = 1;
range->length = 1;
return YES;
}

- (NSRect)rectForPage:(int)page
{
NSPrintOperation *op = [NSPrintOperation currentOperation];
NSPrintInfo *pInfo = [op printInfo];
[self setFrame:NSMakeRect(0,0,[pInfo paperSize].width,[pInfo
paperSize].height)];
[self setBounds:NSMakeRect(0,0,[pInfo paperSize].width,[pInfo
paperSize].height)];
return NSMakeRect(0,0,[pInfo paperSize].width,[pInfo paperSize].height);
}

- (void) drawRect:(NSRect) rect
{
[[NSColor redColor] set];
[NSBezierPath fillRect:rect];
}

@end

...aber das kann es ja irgendwie auch nicht sein. Das Drucken würde
die Größe der View auf dem Bildschirm ändern.
Nun dachte ich - man könnte natürlich eine neue Instanz der View -nur
zum Drucken- erzeugen und die nirgends einhängen.

Wie würdet Ihr das angehen?

Gruss,
Torsten

Frank Illenberger

unread,
Oct 5, 2011, 1:32:01 PM10/5/11
to cocoaheads...@googlegroups.com
Hi Torsten,

Nach seinem Vortrag sind das hier eigentlich ein paar Fragen für Frank.
Vielleicht interessiert es aber auch sonst noch jemanden - deswegen
frage ich einfach mal bei uns auf der Liste.

Ich arbeite gerade an einer Mac App. Wichtiger Bestandteil ist eine
Custom View. Diese View verhält sich ein bisschen so wie iCal. Es gibt
mehrere Spalten und beim Ändern der Window Größe verändern sich die
Breite der Spalten. Die View nimmt die ganze Breite ein. Nun gibt es
einmal natürlich die Probleme die Frank ja im Vortrag gut dargestellt
hast. Also erst einmal die Frage: Frank, gibt es die Folien und/oder
Code schon irgendwo?


ich hab die Folien des Macoun-Vortrags und den Beispielcode mal an die E-Mail gehängt: 
Mcaoun 2011.zip

Torsten Curdt

unread,
Oct 5, 2011, 1:49:42 PM10/5/11
to cocoaheads...@googlegroups.com
> Du darfst nicht den Fehler machen und zum Drucken die gleiche View
> verwenden, die bereits im Fenster verwendet wird. Ich verwende stets
> separate View + Controller-Instanzen dafür. Denn im Allgemeinen will man die
> View für den Ausdruck sowieso etwas umkonfigurieren, z.B. andere
> Hintergrundfarbe, Gradienten etc. und da Drucken asynchron ist, würde einem
> ansonsten immer die View im Fenster flackern.

Also auch komplett andere Klassen - eine für den Screen, eine zum Drucken?
Oder schaut die View was sie malen soll und Du hast nur zwei
Unterschiedliche Instanzen?

Gruss,
Torsten

Frank Illenberger

unread,
Oct 5, 2011, 2:03:18 PM10/5/11
to cocoaheads...@googlegroups.com
Ich verwende zum Drucken immer die gleichen Klassen wie für den Screen, denn die Vererbungsdimension brauche ich meist für was anderes. Ich gebe dem View Controller eine BOOL-Property "isForPrinting", damit man beim Konfigurieren und Zeichnen Unterschiede machen kann, und eine Methode wie -configureFromViewController: damit die Druckinstanz die Einstellungen der Screen-Instanz übernehmen kann und eine weitere Methode -configureForPrinting, die die Besonderheiten des Druckens (Scroller ausschalten etc.) herstellt.

> --
> Sie haben diese Nachricht erhalten, weil Sie der Google Groups-Gruppe CocoaHeads Frankfurt beigetreten sind.
> Wenn Sie Nachrichten in dieser Gruppe posten möchten, senden Sie eine E-Mail an cocoaheads...@googlegroups.com.
> Wenn Sie aus dieser Gruppe austreten möchten, senden Sie eine E-Mail an cocoaheads-frank...@googlegroups.com.
> Besuchen Sie die Gruppe unter http://groups.google.com/group/cocoaheads-frankfurt?hl=de, um weitere Optionen zu erhalten.
>

Reply all
Reply to author
Forward
0 new messages