[Résolu] Impression multipage : rectForPage appelée une seule fois...

MickMick Membre
décembre 2010 modifié dans API AppKit #1
Bonjour à  tous,

J'ai une view multipage à  imprimer. J'avais implémenté pour Tiger et cela fonctionnait bien (code joint), mais depuis que j'ai investt dans un magnifique macbook pro avec snowleopard, seule la première page est imprimée à  l'identique autant de fois qu'il y a de page. j'ai donc par exemple 4 pages identiques...

l'array lesTableaux contient des NSAttributedString construite avec des textTable.

Au débug, je m'aprerçois que la méthode rectForPage n'est appelée qu'une fois bien qu'il y ait plusieurs pages...

Quelqu'un voit un soucis ?....

<br />@implementation TextViewCompetencesParEleves<br />- (id) initWithFrame:(NSRect)frame {<br />	self = [super initWithFrame:frame];<br />	if (self != nil) {<br />		lesTableaux=[[NSArray alloc] init];<br />	}<br />	return self;<br />}<br /><br />- (void) dealloc {<br />	[lesTableaux release];<br />	[super dealloc];<br />}<br /><br />- (void)setLesTableaux:(NSArray *)unTableau {<br />	if(unTableau!=lesTableaux) {<br />		[lesTableaux release];<br />		lesTableaux=[unTableau copy];<br />	}<br />}<br /><br />- (void)setNbreDePage:(int)pages {<br />	nbreDePage=pages;<br />}<br />- (void)setNbreDeTableauxParPage:(int)nbreTabl {<br />	nbreTableauxParPage=nbreTabl;<br />}<br />- (void)drawRect:(NSRect)rect {<br />	<br />	NSArray *lesSub=[self subviews];<br />	NSEnumerator *enumView=[lesSub objectEnumerator];<br />	id uneVue;<br />	while (uneVue=[enumView nextObject]) {<br />		[uneVue removeFromSuperview];<br />	}<br />	int i=(pageEnCours-1)*nbreTableauxParPage;<br />	NSMutableAttributedString *uneString;<br />	NSTextView *uneView;<br />	if([lesTableaux count]==0) return;<br />	uneString=[lesTableaux objectAtIndex:0];<br />	NSRect rectDUneString=[uneString boundingRectWithSize:NSZeroSize<br />					options:NSStringDrawingUsesLineFragmentOrigin];<br />	while (i&lt;nbreTableauxParPage*pageEnCours &amp;&amp; i&lt;[lesTableaux count]) {<br />		uneString=[lesTableaux objectAtIndex:i];<br />		NSRect leRectADrawer=NSMakeRect(0.0,NSHeight(rectDUneString)*(i-(pageEnCours-1)*nbreTableauxParPage),NSWidth(rectDUneString),NSHeight(rectDUneString));<br />		uneView=[[NSTextView alloc] initWithFrame:leRectADrawer];<br />		[[uneView textStorage] setAttributedString:uneString];<br />		[self addSubview:uneView];<br />		[uneView release];<br />		i++;<br />	}<br />}<br /><br />- (BOOL)isFlipped {<br />	return YES;<br />}<br /><br />- (BOOL)knowsPageRange:(NSRangePointer)range {<br />	range-&gt;location=1;<br />	range-&gt;length=nbreDePage;<br />	return YES;<br />}<br /><br />- (NSRect)rectForPage:(int)page {<br />	pageEnCours=page;<br />	return [self bounds];<br />}<br /><br />

Réponses

  • MickMick Membre
    12:25 modifié #2
    Bonjour,

    En fait rectForPage est bien appelée, mais comme je retourne le même rectangle, et bien drawRect n'est pas appelé. J'ai beau mettre un setNeedsDisplayInRect dans la méthode rectForPage, rien n'y fait. Le système n'appelle pas drawRect car il croit qu'il n'a pas besoin de retracer la vue.

    Comment le forcer à  retracer la vue pour chaque page ? (encore un automatisme d'optimisation ... qui nous pompe l'air ! sur Tiger, drawRect était appelée même si le rectangle n'est pas déclaré "sale". C'est comme -ci la vue était "bufferisée"
  • MickMick Membre
    12:25 modifié #3
    Bon, j'ai réussi à  contourner le problème en supprimant les subviews non pas dans drawRect mais dans rectForPage. Du coup, la vue est forcément considérée comme "sale" et drawrect est donc bien appelée après le changement de page.

    Merci tout de même !
  • muqaddarmuqaddar Administrateur
    12:25 modifié #4
    De rien ! J'espère qu'on t'a bien aidé pour le coup ! ;)

    [size=8pt](et il arrive parfois que je trouve la réponse à  mes questions au moment où j'écris la question sur le forum...)[/size]
  • ClicCoolClicCool Membre
    12:25 modifié #5
    Merci à  toi Mick, les impressions ne sont pas assez souvent évoquées.
    Faut croire qu'on est très peu à  y avoir recours ?
  • AliGatorAliGator Membre, Modérateur
    12:25 modifié #6
    Bah oui ça doit être ça, sauvez les arbres :P
  • cyranocyrano Membre
    12:25 modifié #7
    sauvez les arbres
    


    encore une légende urbaine.
  • ClicCoolClicCool Membre
    12:25 modifié #8
    dans 1291641970:

    Bah oui ça doit être ça, sauvez les arbres :P


    Oui mais si on exploite pas les arbres, on n'en fera plus pousser ... :P

    Et SVP amis silviculteurs, ne plantez pas des Douglas, les cèpes aiment pas du tout le Douglas, pas glop pas glop le Douglas :(
Connectez-vous ou Inscrivez-vous pour répondre.