Zones de texte de hauteur variable pour l'impression
maestric
Membre
Voila, j'ai un tableau (NSArray) de dictionnaires (NSDictionnary) de chaà®nes (NSString). Je voudrais l'imprimer avec un dictionnaire par ligne. Dans le dictionnaire, j'ai un champ (NSString) qui peut-être très long et qui demandera donc plusieurs lignes.
Comment avoir la hauteur du NSRect dans lequel je vais dessiner ce NSString ? La hauteur pour une ligne est 30, pour 2 -> 60, etc Mais comment avoir le nombre de lignes ??
Comment avoir la hauteur du NSRect dans lequel je vais dessiner ce NSString ? La hauteur pour une ligne est 30, pour 2 -> 60, etc Mais comment avoir le nombre de lignes ??
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
La solution la plus facile facile à mettre en ½uvre serait de générer du HTML, que tu places dans une WebView et c'est cette webview que tu imprimes. Sinon il est possible de générer un NSTextSortage, mais tu seras limité si tu veux afficher des tableaux (à moins de faire du Tiger Only).
(/System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSStringDrawing.h
Celle de AliGator :
et celle dans la doc d'Apple à propos de NSLayout :
Les deux renvoient strictement la même valeur, mais quand je dessine, la valeur est trop petite ! Il manque toujours une partie de la dernière ligne ! Ci-dessous, j'ai dessiné les rectangles conteneurs.
Avez-vous déjà eu un problème similaire ?
Voilà l'appli : http://www.maestric.com/shared/cocoa/NSTextViewPrinting.zip
et une capture d'écran. Si vous avez le temps d'y jeter un coup d'½il..Â
http://www.cocoabuilder.com/archive/message/cocoa/2006/1/3/153626
En résumé, voilà une fonction qui marche parfaitement, qui renvoie pour
- une chaine
- une police
- une largeur
la hauteur optimale d'un rectangle où est inscrit la chaà®ne écrite dans la police donnée.
Je déterre ce thread car j'ai aussi des soucis avec le sizeToFit qui fixe une hauteur trop petite.
J'ai donc une NSView (connectée à un IBOutlet nommé printView) Off-Screen, bâtie sous I.B., contenant divers "objets décoratifs" des NSTextFields d'information et une NSTextView (connectée à un IBOutlet nommé printText) centrale qui doit pouvoir s'entendre sur plusieurs pages si besoin est.
La TextView est bindée (bien sur) sur un NSData et je dois donc en recalculer la hauteur pour qu'elle puisse s'étendre sur le nombre de pages voulues et j'utilise pour ça -(void) sizeToFit de NSTextView.
et ... je me suis cassé la tête avec la fin du texte manquante, sizeToFit ayant l'air de travailler comme un pied (et devrait donc s'appeler sizeToFeet )
Puis je me suis rendu compte que seule la première impression était tronquée en bas ... !?!
(Pourtant je faisais bien chaque fois un display juste après le sizeToFeet)
J'ai alors bidouillé comme un porc mon code pour essayer de comprendre ce que je loupais, en pure perte car je ne comprend pas et me tourne donc vers vous.
En fait un seul appel à sizeToFit suffit mais suivi par deux séries d'appel à -(void) display de NSView suivi d'un redimensionnement de la printView contenant la NSTextView et j'arrive alors à l'exacte dimension souhaitée.
Bizarrement les appels à display sur la textView semble modifier sa frame ???
Donc ce code marche mais le soucis c'est que:
- 1 j'aimerai comprendre ce qui se passe et pourquoi
- 2 je ne peut pas utiliser un code aussi pourris dans mon projet sans risquer qu'à l'avenir ça foire sans que je comprenne pas non plus ce qui ne va plus
Voici mon code:
Je calcule d'abord la taille à ajouter à celle de ma TextView pour la page
Puis voilà la "tambouille efficace mais si laide
et voici les Logs avec un texte de 24 pages.
On y retrouve 3 hauteurs différentes de la textView à la suite d'un seul appel à sizeToFit:
Quelqu'un a-t-il une inspiration là dessus j'avoue que je n'ai pas codé depuis des mois et ne m'étais jamais encore essayé à l'impression et que sans doutes quelque chose m'échappe là Â :-\\
MERCI et encore BON JOUR à TOUSÂ content de revenir par iciÂ
[EDIT]Â Correction d'un bug dans mon code
je n'ai pas vraiment trouvé de réponse entièrement satisfaisante. Voir l'article IKImageBrowserView.
C'est sans doute un peu d'énervement ;D
Oui j'avais aussi lu ce thread.
Mon bidouilli marche toutefois et tend à prouver que, in finé, sizeToFit marche bien car je n'ai à l'appeler qu'une seule fois.
Par contre je ne comprend pas pourquoi il faut 3 appels à display et 2 adaptations de la taille de la View contenant la TextView pour qu'enfin la hauteur obtenue soit exacte ... ?
Ce serait pas un setNeedsDisplay à bien cibler ? la scroolview, la clipView, la textView, ou la superview ?
C'est une idée, je n'ai pas essayé d'arroser toute la hierachie des views avec un Display.
Je m'y mets de suite.
(j'essaies pas avec un setNeddsDisplay car ma méthode ne rendra pas la main à l'event-loop avant de lancer l'impression)
Elles y sont toutes passées et rien n'y fait !
Faut toujours qu'après le sizeToFit de la textlView, je lui envoie un Display puis re-dimensionne la pageView selon la supposée hauteur puis renvoie un Display à la TextView et re-dimensionne la pageView, puis renvoie un dernier Display à la TextView et re-dimensionne la pageView une dernière fois !!
Moyennant quoi les impressions sont impeccables y compris pour une textView de plus de 60 pages.
Et d'un autre côté, si j'imprime directement la textView seule, un sizeToFit seul (sans aucun appel à Display etc.) marche impeccable.
L'imbroglio doit donc en effet se trouver dans la hiérarchie des vues plus qu'ailleurs.
Merci de cette inspiration, Je vais aller voir un peu du côté des Resizing-masks.
Si je ne parvient pas à comprendre pourquoi, je crois que je finirais par bâtir tout ça dans une webView en espérant y trouver une solution pérenne...
Par contre je corrige mon code ci-dessus.
C'est pas la textView qu'il faut "rapetisser" au début mais la pageView contenant la textView (le textView suivant le mouvement par le jeu des Resizing-masks justement.
Sinon au bout de quelques impressions tout se décale