Attributed String sans NSAttributedString
Nebuchad34
Membre
Bonjour !
J'ai constaté, hier, qu'Apple n'avait pas fait don à son iPhone SDK de la classe NSAttributedString !
Vraiment dommage, car on perd alors la possibilité de mettre facilement du texte enrichi dans le titre des UITableViewCell par exemple. J'avais en fait besoin de mettre tout bêtement des lettres majuscules en indice du titre de ma cell !
J'ai donc réfléchi un peu et trouvé une solution, mais je ne sais pas si elle est tip top niveau performance.
J'ai ainsi créé une sous classe de UIWebView appellée AttributedStringCellView
Avec une méthode de classe, je lui demande de me retourner une vue adaptée aux cells, selon que la TableView et en Style Grouped ou Plain.
J'ajoute cette vue en subView de la cell dans la définition de la reusableCell
A chaque fois que le CellForRow est appellé, je n'ai plus qu'à faire appel à une méthode "setURLString:" sur mon objet AttributedStringCellView qui va, derrière, appeler la méthode loadURL:baseURL: de UIWebView, mais en vérifiant qu'on ne charge pas le même texte (car une UIWebView c'est assez lourd...)
Avec l'astuce ci-dessus, vu que c'est pour charger des titres de cellules, mes UIWebView ne sont en fait réellement "loadées" qu'une fois.
Qu'en pensez vous ?? Si quelqu'un a une idée pour faire quelque chose de plus léger, je suis prenneur.
Voilà le code de la dite Classe :
Et voilà l'utilisation dans mon CellForRow :
J'ai constaté, hier, qu'Apple n'avait pas fait don à son iPhone SDK de la classe NSAttributedString !
Vraiment dommage, car on perd alors la possibilité de mettre facilement du texte enrichi dans le titre des UITableViewCell par exemple. J'avais en fait besoin de mettre tout bêtement des lettres majuscules en indice du titre de ma cell !
J'ai donc réfléchi un peu et trouvé une solution, mais je ne sais pas si elle est tip top niveau performance.
J'ai ainsi créé une sous classe de UIWebView appellée AttributedStringCellView
Avec une méthode de classe, je lui demande de me retourner une vue adaptée aux cells, selon que la TableView et en Style Grouped ou Plain.
J'ajoute cette vue en subView de la cell dans la définition de la reusableCell
A chaque fois que le CellForRow est appellé, je n'ai plus qu'à faire appel à une méthode "setURLString:" sur mon objet AttributedStringCellView qui va, derrière, appeler la méthode loadURL:baseURL: de UIWebView, mais en vérifiant qu'on ne charge pas le même texte (car une UIWebView c'est assez lourd...)
Avec l'astuce ci-dessus, vu que c'est pour charger des titres de cellules, mes UIWebView ne sont en fait réellement "loadées" qu'une fois.
Qu'en pensez vous ?? Si quelqu'un a une idée pour faire quelque chose de plus léger, je suis prenneur.
Voilà le code de la dite Classe :
<br />// AttributedStringCellView.h<br /><br />#import <UIKit/UIKit.h><br /><br />#define AttributedStringViewTag 1<br /><br />@interface AttributedStringCellView : UIWebView {<br /> NSString *currentHTMLString;<br />}<br /><br />@property (retain) NSString *currentHTMLString;<br /><br />+(AttributedStringCellView*)attributedStringWithHTMLString:(NSString*)string forTableViewStyle:(UITableViewStyle)style;<br /><br />+(NSString*)formattedStringWithHTMLString:(NSString*)string;<br /><br />-(void)setHTMLString:(NSString*)string;<br /><br />@end<br /><br />// AttributedStringCellView.m<br /><br />#import "AttributedStringCellView.h"<br /><br /><br />@implementation AttributedStringCellView<br /><br />@synthesize currentHTMLString;<br /><br />+(AttributedStringCellView*)attributedStringWithHTMLString:(NSString*)string forTableViewStyle:(UITableViewStyle)style;<br />{<br /> NSInteger x = 5;<br /> <br /> if (style == UITableViewStyleGrouped)<br /> x = 15;<br /> <br /> AttributedStringCellView *webView = [[AttributedStringCellView alloc] initWithFrame:CGRectMake(x, 2, 150, 40)];<br /> webView.opaque = NO;<br /> webView.backgroundColor = [UIColor clearColor];<br /> webView.tag = AttributedStringViewTag;<br /> [webView loadHTMLString:[AttributedStringCellView formattedStringWithHTMLString:string] baseURL:nil];<br /> webView.currentHTMLString = string;<br /> <br /> <br /> return [webView autorelease];<br />}<br /><br />+ (NSString*)formattedStringWithHTMLString:(NSString*)string {<br /> return [NSString stringWithFormat:@"<style type=\"text/css\">html {font-size: 18px;font-family: Helvetica, Arial, Geneva;font-weight: bold;}</style> %@", string];<br />}<br /><br />- (void)setHTMLString:(NSString*)string {<br /> if ([currentHTMLString isEqualToString:string])<br /> return;<br /> else<br /> [self loadHTMLString:[AttributedStringCellView formattedStringWithHTMLString:string] baseURL:nil];<br />}<br /><br />- (void)dealloc {<br /> [currentHTMLString release];<br /> [super dealloc];<br />}<br /><br />
Et voilà l'utilisation dans mon CellForRow :
<br />- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath<br />{<br /> static NSString *CellIdentifier = @"Cell";<br /> <br /> UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];<br /> if (cell == nil) {<br /> cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];<br /> [cell addSubview:[AttributedStringCellView attributedStringWithHTMLString:nil forTableViewStyle:[tView style]]];<br /> }<br /> <br /> NSString *URLString;<br /> <br /> //Ici je choisi de manière conditionnelle la valeur de URLString, par exemple <br /> // Admettons URLString = @"X<sub>S</sub>"; (coordonnée X d'un point S....)<br /> <br /> AttributedStringCellView *attributedStringView = (AttributedStringCellView*)[cell viewWithTag:AttributedStringViewTag];<br /> [attributedStringView setHTMLString:URLString];<br /><br /> return cell;<br />}<br />
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
-(void)drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:
Pour ce qui est des additions de NSString, je ne connaissais pas. C'est à voir effectivement. C'est en tout cas une piste interessante. Pour l'usage actuel, le UIWebView fonctionne bien. Mais comme cela risque de faire lourd si je dois le réutiliser de manière plus intensive, à ce moment là je jetterai un oeil du côté de
-(void)drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:
Merci pour l'info.