2010-02-14 10 views
1

J'utilise Three20 TTStyledTextLabel et quand je change la police par défaut (Helvetica) à autre chose, il crée une sorte de différence de hauteur entre les liens et le texte régulierTTStyledTextLabel décalage entre le lien et le texte régulier lors du passage de la police par défaut

le code suivant démontre mon problème:

#import <Three20/Three20.h> 


    @interface TestController : UIViewController { 

    } 

    @end 


    @implementation TestController 
    -(id)init{ 
     self = [super init]; 
     TTStyledTextLabel* label = [[[TTStyledTextLabel alloc] initWithFrame:CGRectMake(0, 0, 320, 230)] autorelease]; 
     label.text = [TTStyledText textFromXHTML:@"<a href=\"aa://link1\">link</a> text" lineBreaks:YES URLs:YES]; 
     [label setFont:[UIFont systemFontOfSize:16]]; 
     [[self view] addSubview:label]; 


     TTStyledTextLabel* label2 = [[[TTStyledTextLabel alloc] initWithFrame:CGRectMake(0, 230, 320, 230)] autorelease]; 
     label2.text = [TTStyledText textFromXHTML:@"<a href=\"aa://link1\">link2</a> text2" lineBreaks:YES URLs:YES]; 
     [label2 setFont:[UIFont fontWithName:@"HelveticaNeue" size:16]]; 
     [[self view] addSubview:label2]; 
     return self; 
    } 
    @end 

Screen Shot

Dans la capture d'écran, vous pouvez voir que le premier lien est aligné et le second n'est pas

Comment le réparer? Je pense qu'il ya un bogue dans le code TTStyledTextLabel ...

Répondre

2

je viens commentais - (void)offsetFrame:(TTStyledFrame*)frame by:(CGFloat)y (TTStyledLayout.m: 87) sur et il a fait l'affaire. bien sûr, il peut casser d'autres choses.

modifier: i a également commenté les bits suivants de code

if (!font) { 
// if ([elt isKindOfClass:[TTStyledLinkNode class]] 
//  || [elt isKindOfClass:[TTStyledBoldNode class]]) { 
//  font = self.boldFont; 
// } else if ([elt isKindOfClass:[TTStyledItalicNode class]]) { 
//  font = self.italicFont; 
// } else { 
     font = self.font; 
// } 
} 

pour se débarrasser de la police en gras.

0

Si vous regardez le source code, la police est définie en utilisant un style: self.font = TTSTYLEVAR(font). Je ferais deux choses ici

  1. Créer une catégorie qui remplace la méthode initWithFrame. Laissez tout le même, sauf renommer self.font = TTSTYLEVAR(font) à autre chose comme tableXFont de sorte que le changement de style de police n'affectera pas l'ensemble de votre application.
  2. Créez et enregistrez votre propre feuille de style afin que le tableXFont soit défini.

Cela devrait vous mettre sur la bonne voie à la bonne façon de faire la police Three20 et la personnalisation du style

+0

Eh bien, j'ai un Déjà essayé d'écrire ma propre feuille de style et en remplaçant la méthode de police, Cela avait le même comportement –

1

Dans la dernière version de three20 à ce jour, il me semble que le problème réside chez TTStyledLayout: 345.

Plus précisément, le changement:

[self offsetFrame:frame by:(_lineHeight - (frame.height - font.descender))];

à

[self offsetFrame:frame by:(_lineHeight - (frame.height /* - font.descender */))];

... semble résoudre le problème. Après avoir regardé le code TT pendant un certain temps, je crois que votre problème ne se pose que lorsqu'il y a des URL sur une ligne car l'audace de l'URL gonfle une certaine "hauteur de ligne" ivar. Si vous ne voulez pas fourrer three20, vous pouvez probablement modifier votre feuille de style pour vous assurer que les hauteurs de ligne des URL ne sont pas différentes de la hauteur de ligne du reste de votre texte. Je ne fais que spéculer, cependant.

Je prévois de déposer un rapport de bogue à ce sujet également.

+0

J'ai essayé cela, mais je pense que cela n'a pas fonctionné sur le texte multiligne –

0

Cela vaut mieux, donc il ne changera pas le style de TTStyledBoldNodeclass

Code d'origine:

if (!font) { 
if ([elt isKindOfClass:[TTStyledLinkNodeclass]] 
    || [elt isKindOfClass:[TTStyledBoldNodeclass]]) { 
    font = self.boldFont; 

} elseif ([elt isKindOfClass:[TTStyledItalicNodeclass]]) { 
    font = self.italicFont; 

} else { 
    font = self.font; 
} 

}

code fixe:

if (!font) { 
if ([elt isKindOfClass:[TTStyledBoldNodeclass]]) { 
    font = self.boldFont; 

} elseif ([elt isKindOfClass:[TTStyledItalicNodeclass]]) { 
    font = self.italicFont; 

} else { 
    font = self.font; 
} 

}