Question

J'ai une longue NSString je veux afficher sur deux pages.

Mais pour ce faire, je dois savoir comment le texte sera en fait beaucoup tenir sur la page.

[NSString sizeWithFont: ...] ne suffit pas, il va juste me dire si le texte inscrit dans le rectangle ou non, si elle ne le fait pas, il sera silencieusement tronquer la chaîne, mais il ne me dira pas où elle tronquée!

Je dois savoir le premier mot qui ne correspond pas à la page, alors je peux diviser la chaîne et d'en tirer partie de celui-ci sur la page suivante. (Et répétition)

Toutes les idées comment résoudre ce problème?

idée seulement je me jusqu'à présent est d'appeler à plusieurs reprises sizeWithFont: constrainedToSize: autour du point dans la chaîne où je devine que le saut de page sera, et d'analyser les rect résultant, mais il se sent lourd et lent et je me sens Je pourrais avoir des problèmes supplémentaires obtenir à 100% de précision ... (en raison de descendeurs, et ainsi de suite.)

ofc, il doit être disponible dans le SDK iOS publique

Réponse:

Pff, qui était une documentation poilue. Voici ma fonction finie comme un exemple, peut-être pour aider quelqu'un, car il n'y a pas beaucoup d'exemples de textes de base spécifiques à l'iPhone sur le marché.

+ (NSArray*) findPageSplits:(NSString*)string size:(CGSize)size font:(UIFont*)font;
{
  NSMutableArray* result = [[NSMutableArray alloc] initWithCapacity:32];
  CTFontRef fnt = CTFontCreateWithName((CFStringRef)font.fontName, font.pointSize,NULL);
  CFAttributedStringRef str = CFAttributedStringCreate(kCFAllocatorDefault, 
                                                       (CFStringRef)string, 
                                                       (CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys:(id)fnt,kCTFontAttributeName,nil]);
  CTFramesetterRef fs = CTFramesetterCreateWithAttributedString(str);
  CFRange r = {0,0};
  CFRange res = {0,0};
  NSInteger str_len = [string length];
  do {
    CTFramesetterSuggestFrameSizeWithConstraints(fs,r, NULL, size, &res);
    r.location += res.length;
    [result addObject:[NSNumber numberWithInt:res.length]];
  } while(r.location < str_len);
//  NSLog(@"%@",result);
  CFRelease(fs);
  CFRelease(str);
  CFRelease(fnt);
  return result;
}  

NOTE IMPORTANTE:

Vous ne pouvez pas utiliser la plage de retour ou de la taille avec toutes les classes UIKit ou fonctions de dessin de chaîne! Vous ne devez l'utiliser avec Core Text, par exemple la création d'un dessin CTFrame et que. Des différences subtiles dans des choses comme crénage, il est impossible de combiner les fonctions de texte de base avec UIKit.

En outre, notez que la taille de retour a été trouvé buggy.

Était-ce utile?

La solution

Vous devriez regarder dans CoreText, disponible depuis iOS 3.2. Les documents sont assez compliquées et peuvent être trouvés href="https://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/CoreText_Programming/Introduction/Introduction.html" ici . Fondamentalement, vous créez un CTFramesetter et appelez CTFramesetterSuggestFrameSizeWithConstraints. Vous trouverez ensuite la plage de texte qui correspond à l'intérieur d'un CGSize donné.

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