Dans UILabel, il existe des fonctionnalités pour tronquer les labels en utilisant différentes techniques de troncature (UILineBreakMode). Dans NSSsortingng UIKit Additions, il existe une fonctionnalité similaire pour dessiner des strings.
Cependant, je n'ai trouvé aucun moyen d'accéder à la string tronquée réelle. Existe-t-il un autre moyen d'get une string tronquée basée sur la largeur (graphique) pour une police donnée?
J'aimerais avoir une catégorie sur NSSsortingng avec cette méthode:
-(NSSsortingng*)ssortingngByTruncatingSsortingngWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode
Une option consiste à essayer différentes tailles en faisant une boucle jusqu'à get la bonne largeur. C'est à dire commencer par la string complète, si elle est plus large que ce dont vous avez besoin, remplacez les deux derniers caractères par un ellipse. Boucle jusqu'à ce qu'il soit assez étroit.
Si vous pensez que vous allez travailler avec de longues strings, vous pouvez searchr binary votre path vers le sharepoint troncature pour le rendre un peu plus rapide.
- (NSSsortingng*)ssortingngByTruncatingSsortingngWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode { NSMutableSsortingng *resultSsortingng = [[self mutableCopy] autorelease]; NSRange range = {resultSsortingng.length-1, 1}; while ([resultSsortingng boundingRectWithSize:CGSizeMake(FLT_MAX, FLT_MAX) options:NSSsortingngDrawingUsesLineFragmentOrigin | NSSsortingngDrawingUsesFontLeading atsortingbutes:atsortingbutes context:nil].size.width > width) { // delete the last character [resultSsortingng deleteCharactersInRange:range]; range.location--; // replace the last but one character with an ellipsis [resultSsortingng replaceCharactersInRange:range withSsortingng:truncateReplacementSsortingng]; } return resultSsortingng; }
Notez que depuis iOS 6, cette méthode n'est plus sécuritaire à exécuter sur les threads d'arrière-plan.