Drucken auf dem Mac mit eigenem PrintView

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Drucken auf dem Mac mit eigenem PrintView

    Hallo an alle,

    ich bin gerade dabei, mir ein PrintView zu basteln; bzw. eigentlich sind es zwei. Und genau das ist das Problem. Als Erstes habe ich eine NSView-Subklasse "PrintableGridView". Diese ist allgemein gehalten, hat ein DataSource- und ein Delegate-Protokoll, so dass ich damit jedes beliebige Grid drucken kann. Wenn es ich dieses View in der NSPrintOperation als View setze, sieht alles wunderbar aus.
    Nun kommt das zweite View ins Spiel, das spezieller ist. In diesem möchte ich zwei Subviews der Klasse "PrintableGridView" unterbringen; sprich ich habe im Prinzip zwei Tabellen untereinander. Leider sehe ich in der Vorschau im PrintPanel gar nichts! Es wird auch keine einzige Zeichenmethode von "PrintableGridView" aufgerufen. Die Subviews habe ich per addSubview: hinzugefügt und diese werden auch angezeigt, wenn ich sie mir im Log ausgeben lasse. Die Frames sind auch nicht {0,0,0,0}, aber es wird eben nichts gezeichnet..

    Hat jemand von euch schon mal ein PrintView gebastelt, das Subviews enthält? Wie bekomme ich diese dazu, dass sie gezeichnet werden?

    Ich bin über jede Hilfe dankbar.

    Alex
  • Hi,

    die Vermutung hatte ich auch schon, dass der Frame des Subviews außerhalb des Views liegt. Das habe ich dann mal mit NSIntersectsRect() überprüft. Ich habe auch mal dem Subview den Frame des Superviews gegeben -> nüscht..

    Mittlerweile habe ich rausgefunden, dass ich etwas angezeigt bekomme, wenn ich das Subview im Initializer zufüge und dessen Frame auf den gleichen Frame wie den des Superviews setze. Sobald ich aber -knowsPageRange: im Superview implementiere, geht nix mehr.. Dann wird auch drawRect: im Subview nicht mehr aufgerufen. Ich vermute also, dass der Subview in dem Fall nicht sichtbar ist und deswegen nicht gezeichnet wird bzw. werden muss.. Warum, versuche ich noch herauszufinden..

    Auf jeden Fall sehr merkwürdig..
  • Ja, gebe 'YES' zurück..

    Das Problem, das ich habe, ist, dass das Superview sich im Prinzip ja seine eigene Größe vom Subview holen muss, da ja nur dieses die Größe weiß, indem es sich die Anzahl der Columns, dessen Breite, etc. von der DataSource bzw. dem Delegate holt. Ich vermute, dass das Problem irgendwo darin begraben liegt, dass die Größen auch wieder von der NSPrintOperation abhängen. Alles in allem ist es ein ganz schönes Wirrwarr..
  • Na ja, nur bedingt.. Die Größe ergibt sich ja erst, wenn die DataSource weiß, wieviele Rows und Columns es gibt und was die für eine Ausdehnung haben. In knowsPageRange: muss ich dann ja berechnen, wieviele Seiten sich dann daraus bei der aktuell eingestellten Seitengröße ergeben.. Das klappt ja auch, wenn ich mit meinem "PrintableGridView" direkt drucke.. Also ich hab es vorhin schon mal geschafft, dass was angezeigt wird, aber bei der zweiten Seite war das dann wieder nix.. Ich werde mal weiter probieren..
  • Hi,

    falls es jemanden interessiert. Ich habe es nun hinbekommen.. Es ist tatsächlich so, dass ich sämtliche Frames, usw. in meinem Superview ausrechnen muss. In initWithFrame: füge ich meine Subviews hinzu und passe den Frame des Superviews entsprechend an (hier kenne ich die Größe der einzelnen Subviews).

    - Die Methoden knowsPageRange:, rectForPage: und -beginPageInrect:location: werden in den Subviews so implementiert, dass sie unabhängig funktionieren.
    - Im Superview iteriere ich in knowsPageRange: durch alle Subviews, rufe dort knowsPageRange: auf und bastel mir per NSUnionRange() eine Range, die alle Seiten aller Subviews enthält.
    - Dies führt natürlich dazu, dass ich in rectForPage: des Superviews jeweils beachten muss, welches Subview auf dieser Page ist. Dafür habe ich mir eine Helfer-Methode -subviewAtPage: implementiert
    - Außerdem muss ich die page des Superviews auf die des Subviews umrechnen -> Seite 1 des zweiten Subviews entspricht ja nicht unbedingt insgesamt Seite 1. Wenn ich dies nicht mache, dann stimmt das Argument in -rectForPage: nicht
    - Dann gebe ich in -rectForPage: des Superviews einfach -rectForPage: des entsprechenden Subviews mit der spezifischen page zurück.
    - Genau so gehe ich in -beginPageInRect:location: vor. Rausfinden, welches Subview auf dieser Seite 'wohnt' und dort zeichnen ->
    - Dafür habe ich in der Subview-Klasse eine öffentliche Methode -drawPage:inRect: deklariert.

    Dadurch, dass ich mir das Rect aus dem Subview hole, funktionieren diese auch unabhängig vom Superview.

    Ich hoffe, das war jetzt einigermäßen verständlich. Ansonsten könnt ihr mir bei Interesse gerne schreiben..

    Gruß Alex