Comment utiliser NSString de sizeWithFont et drawInRect à la séance d'entraînement de la façon dont beaucoup d'une chaîne à dessiner

StackOverflow https://stackoverflow.com/questions/4965809

Question

Je m'inspire de plusieurs "pages" de l'imagerie à l'aide d'un CGContext dans l'iOS.J'ai utilisé sizeWithFont et drawInRect combinaisons largement dans mon application.Ce dont j'ai besoin à faire est de couper un gros morceau de texte sur plusieurs pages.Je peux la taille de ce travail et si oui ou non il a besoin d'une autre page, mais comment puis-je savoir où couper?Dois-je faire une vilaine boucle pour vérifier un mot par mot jusqu'à ce que je trouve une longueur de chaîne qui s'inscrit parfaitement dans la page puis couper la chaîne à ce point?Est-il une façon plus intelligente?

Des idées?

Merci.

Était-ce utile?

La solution

L' NSString ajouts pour UIKit pour dessiner le texte, vous pouvez pré-déterminer le montant exact de l'espace nécessaire pour rendre un texte donné pour une police donnée.Si le fractionnement du texte dans les pages, vous pouvez utiliser cette méthode.

– sizeWithFont:constrainedToSize:lineBreakMode:

En supposant que la police et le saut de ligne mode est connu, créer un CGSize avoir la même largeur que votre page, et d'utiliser un nombre suffisant de hauteur.Ce serait la taille maximale que nous sommes en contraignant le texte.

CGSize maximumSize = CGSizeMake(pageWidth, 999999999);
CGSize expectedSize = [veryLongString sizeWithFont:theFont constrainedToSize:maximumSize lineBreakMode:theLineBreakMode];

expectedSize va nous dire la taille que le texte prendra en supposant que si elle pouvait s'étendre verticalement à l'infini (enfin presque).Pour trouver le nombre de pages requis, il suffit de diviser le total de la hauteur en fonction de la hauteur d'une page.

NSInteger totalPages = ceil(expectedSize.height / heightOfOnePage);

Vous voulez également d'ajuster la hauteur d'une page à assurez-vous que la dernière ligne de texte ne doit pas être coupés.Pour cela, la hauteur de la page doit être un multiple de la police de la hauteur de la ligne.Dire que la page initiale de la hauteur est 300px, et la police-la hauteur est 16px, alors , il y aura un peu de clipping comme 300/16 = 18.75 ce qui n'est pas un nombre entier.

NSInteger linesWithoutClipping = floor(initialPageHeight / theFont.lineHeight);
CGFloat optimalPageHeight = linesWithoutClipping * theFont.lineHeight;

La prise de parole de la valeur 18 et de multiplication des avec la police de la hauteur de ligne 16, nous obtenons une page optimale de la hauteur de 288 pour s'assurer il n'y a pas de coupure.

Notez que lineHeight a été introduit dans l'iOS 4.0, mais on pouvait le calculer vous-mêmes si nécessaire pour les versions plus anciennes.

Autres conseils

La façon dont je me passe autour de ce problème est de diviser les rendements de la ligne.

NSArray * paragraphs = [text componentsSeparatedByString:@"\n"];

Vous devez toujours faire tout le travail pour déterminer les pauses de page et la même chose, mais j'ai trouvé cela la meilleure solution de contournement jusqu'à présent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top