imprimer une NSVue : problème avec les ombres

Bonjour


 


Je souhaite imprimer une NSView (une NSScrollView exactement) contenue dans une NSWindowControleur. Cette NSScrollView contient entre autre une NSBox sur laquelle j'ai dessiné l'ombre via l'IB, ainsi qu'une couleur de fond via 



[scrollView setWantsLayer:YES];
[scrollView setBackgroundColor:[NSColor redColor]];
[scrollView setDrawsBackground:YES];

Cependant, l'impression de ma scrollView ne m'affiche ni cette couleur de fond, ni l'ombre de ma box. Voici mon code : 



-(IBAction)actionPrint:(id)sender
{

NSPrintInfo *printInfo = [NSPrintInfo sharedPrintInfo];
[printInfo setTopMargin:0];
[printInfo setBottomMargin:0];
[printInfo setLeftMargin:0];
[printInfo setRightMargin:0];
[printInfo setScalingFactor:.85];

[scrollView print: sender];
}


Qu'est ce qu'il me manque ??


 


Merci d'avance


 


Réponses

  • CéroceCéroce Membre, Modérateur

    D'expérience, l'impression de NSViews standard donne des résultats assez variables.


    De toute façon, c'est facile à  coder mais c'est moche et ça gère très mal la mise en page. Tu devras faire toi-même le dessin à  un moment où un autre.


  • AIe.... bon merci quand même

  • Bien j'ai essayé ça mais ça me donne une erreur au moment du print : 



    NSImage *img = [[NSImage alloc] initWithData:[scrollView dataWithPDFInsideRect:[scrollView bounds]]];

    NSImageView *imgView = [[NSImageView alloc] initWithFrame:[scrollView bounds]];
    [imgView setImage:img];
    [imgView print:nil];

    L'erreur est la suivante : Assertion failed: (s->stack->next != NULL), function CGGStackRestore, file Context/CGGStack.c, line 77.


     


    Qu'est ce qui c'est passé et comment y remédier ?


     


    Merci d'avance




  • Bien j'ai essayé ça mais ça me donne une erreur au moment du print : 



    NSImage *img = [[NSImage alloc] initWithData:[scrollView dataWithPDFInsideRect:[scrollView bounds]]];

    NSImageView *imgView = [[NSImageView alloc] initWithFrame:[scrollView bounds]];
    [imgView setImage:img];
    [imgView print:nil];

    L'erreur est la suivante : Assertion failed: (s->stack->next != NULL), function CGGStackRestore, file Context/CGGStack.c, line 77.


     


    Qu'est ce qui c'est passé et comment y remédier ?


     


    Merci d'avance




     


    Salut,


     


    Chez moi le code marche,


     


    tu utilises CGContextSaveGState,CGContextRestoreGState dans ton code ?

  • Pas du tout


     


    Je m'en sert comment?


    Dans la doc de NSView, je n'ai rien vue de tel ...




  • Pas du tout


     


    Je m'en sert comment?


    Dans la doc de NSView, je n'ai rien vue de tel ...




     


    Je demandais au cas ou, l'erreur ressemble a une erreur de pile


     


    fais nous un zip avec ton projet, si tu peux

  • Je viens de faire un mini projet et oui, en effet, ça marche ici. Bon je vais regarder cela de plus près dans mon code


     


    Ceci étant, l'ombre de ma box n'apparait toujours pas


     


    Comment dois je faire pour la faire apparaitre ???


     


    Voici le zip


  • devulderdevulder Membre
    novembre 2014 modifié #9

    Bonjour,


     


    Je penses que le problême est résolu (shadow affiché et effet du texte pateux enlevé)


     


    J'ai dérivé l'affichage du texte pour quand tu imprimes cela enleve l'antiliasing.



    bool print = false;

    //print = true; quand tu clique sur le boutton imprimer

    @interface mytext : NSTextField

    @end

    @implementation mytext

    - (void)drawRect:(NSRect)dirtyRect
    {
    CGContextRef myContext = (CGContextRef)[[NSGraphicsContext currentContext]graphicsPort];

    if (print)
    {
    CGContextSetShouldSmoothFonts(myContext,true);

    CGContextSetAllowsAntialiasing(myContext,false);
    }

    [super drawRect:dirtyRect];
    }

    @end


    Dis nous si c'est ok


  • Merci Devulder de ton investissement


     


    Ton système est ingénieux : j'ai cette fois ci l'ombre qui apparait mais le texte n'est encore pas très joli. Voila ce que j'ai chez moi lorsque j'enregistre l'impression en pdf : 

Connectez-vous ou Inscrivez-vous pour répondre.