Смещение TTStyledTextLabel между ссылкой и обычным текстом при изменении шрифта по умолчанию
Я использую Three20 TTStyledTextLabel, и когда я изменяю шрифт по умолчанию (Helvetica) на что-то другое, это создает некоторую разницу в высоте между ссылками и обычным текстом
Следующий код демонстрирует мою проблему:
#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
На снимке экрана вы видите, что первая ссылка выровнена, а вторая нет
Как мне это исправить? Я думаю, что есть ошибка в коде TTStyledTextLabel...
4 ответа
Я только что прокомментировал - (void)offsetFrame:(TTStyledFrame*)frame by:(CGFloat)y
(TTStyledLayout.m:87), и он добился цели. конечно это может сломать другие вещи.
редактировать: я также закомментировал следующие биты кода
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;
// }
}
избавиться от жирного шрифта.
В последней версии three20 на момент написания этой статьи мне кажется, что проблема заключается в TTStyledLayout:345.
В частности, меняется:
[self offsetFrame:frame by:(_lineHeight - (frame.height - font.descender))];
в
[self offsetFrame:frame by:(_lineHeight - (frame.height /* - font.descender */ ))];
... кажется, чтобы решить проблему.
Некоторое время спустя, глядя на код TT, я полагаю, что ваша проблема возникает только тогда, когда в строке есть URL-адреса, потому что смелость URL-адреса приводит к увеличению некоторой высоты строки. Если вы не хотите раскошелиться на Three20, вы можете просто изменить таблицу стилей, чтобы высота строк URL-адресов не отличалась от высоты строки остального текста. Я просто спекулирую, хотя.
Я также планирую подать отчет об ошибке.
Это лучше, так что это не изменит стиль TTStyledBoldNodeclass
Оригинальный код:
if (!font) {
if ([elt isKindOfClass:[TTStyledLinkNodeclass]]
|| [elt isKindOfClass:[TTStyledBoldNodeclass]]) {
font = self.boldFont;
} elseif ([elt isKindOfClass:[TTStyledItalicNodeclass]]) {
font = self.italicFont;
} else {
font = self.font;
}
}
Фиксированный код:
if (!font) {
if ([elt isKindOfClass:[TTStyledBoldNodeclass]]) {
font = self.boldFont;
} elseif ([elt isKindOfClass:[TTStyledItalicNodeclass]]) {
font = self.italicFont;
} else {
font = self.font;
}
}
Если вы посмотрите на исходный код, шрифт установлен с использованием стиля: self.font = TTSTYLEVAR(font)
, Я бы сделал две вещи здесь
- Создать категорию, которая переопределяет
initWithFrame
метод. Оставьте все то же самое, кроме переименованияself.font = TTSTYLEVAR(font)
к чему-то другому, какtableXFont
так что изменение стиля шрифта не повлияет на все ваше приложение. - Создайте и зарегистрируйте свою собственную таблицу стилей, чтобы
tableXFont
определено.
Это должно привести вас к правильному пути к правильной настройке шрифтов и стилей