Comment utiliser sizeWithFont et drawInRect de NSSsortingng pour déterminer la quantité de string à dessiner

Je dessine plusieurs 'pages' d'images en utilisant un CGContext dans l'iOS. J'ai largement utilisé les combinaisons sizeWithFont et drawInRect dans mon application. Ce que je dois faire est de scinder une grande partie du text sur plusieurs pages. Je peux le dimensionner et travailler si oui ou non il a besoin d'une autre page, mais comment puis-je savoir où le couper? Dois-je faire une boucle moche pour vérifier mot par mot jusqu'à ce que je trouve une longueur de string qui correspond parfaitement à la page et ensuite couper la string à ce moment-là? Y a-t-il un moyen plus intelligent?

Des idées?

Merci.

Les ajouts de NSSsortingng à UIKit pour le text de dessin, vous pouvez pré-déterminer la quantité exacte d'espace nécessaire pour rendre un text donné pour une police donnée. Si vous divisez le text en pages, vous pouvez utiliser cette méthode.

– sizeWithFont:constrainedToSize:lineBreakMode: 

En supposant que le mode de police et de saut de ligne est connu, créez une CGSize ayant la même largeur que votre page et utilisez un nombre suffisant pour la hauteur. Ce serait la taille maximale dans laquelle nous contraignons le text.

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

expectedSize nous dira la taille que le text prendra en supposant qu'il pourrait s'étendre verticalement infiniment (bien près de). Pour find le nombre de pages requirejs, il suffit de split la hauteur totale par la hauteur d'une page.

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

Vous voudriez également ajuster la taille d'une page pour vous assurer que la dernière ligne de text ne soit pas coupée. Pour que cela se produise, la hauteur de la page devrait être un multiple de la hauteur de ligne de la police. Supposons que la hauteur initiale de la page soit 300px et que la taille de la police soit de 16px , alors il y aura un découpage de 300/16 = 18.75 qui n'est pas un integer.

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

En prenant la valeur de plancher 18 et en multipliant par la hauteur de la ligne de police 16 , nous obtenons une hauteur de page optimale de 288 pour s'assurer qu'il n'y a pas d'écrêtage.

Notez que lineHeight a été introduit dans iOS 4.0, mais vous pouvez le calculer vous-même si nécessaire pour les anciennes versions.

La façon dont je contourne ce problème est de split par des returns de ligne.

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

Vous devez encore faire tout le travail pour déterminer les sauts de page et similaires, mais j'ai trouvé que la meilleure solution de contournement jusqu'à présent.