Смещение TTStyledTextLabel между ссылкой и обычным текстом при изменении шрифта по умолчанию - PullRequest
1 голос
/ 14 февраля 2010

Я использую 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

Screen Shot

На снимке экрана вы видите, что первая ссылка выровнена, а вторая нет

Как мне это исправить? Я думаю, что есть ошибка в коде TTStyledTextLabel ...

Ответы [ 4 ]

2 голосов
/ 19 февраля 2010

Я только что прокомментировал - (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;
//    }
}

чтобы избавиться от жирного шрифта.

1 голос
/ 30 июля 2010

В последней версии three20 на момент написания этой статьи мне кажется, что проблема в TTStyledLayout: 345.

В частности, меняется:

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

до

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

... кажется, решил проблему.

После того, как я некоторое время смотрю на код ТТ, я полагаю, что ваша проблема возникает только тогда, когда в строке есть URL-адреса, потому что смелость URL-адреса накачивает некоторый «высоту строки» ивара. Если вы не хотите раскошелиться на Three20, вы можете просто изменить таблицу стилей, чтобы высота строк URL-адресов не отличалась от высоты строки остального текста. Хотя я просто размышляю.

Я также планирую подать отчет об ошибке.

0 голосов
/ 28 марта 2012

Это лучше, поэтому не изменит стиль 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;
}

}

0 голосов
/ 14 февраля 2010

Если вы посмотрите на исходный код , шрифт будет установлен с использованием стиля: self.font = TTSTYLEVAR(font). Я бы сделал две вещи здесь

  1. Создать категорию, которая переопределяет метод initWithFrame. Оставьте все то же самое, за исключением переименования self.font = TTSTYLEVAR(font), в другое значение, например tableXFont, чтобы изменение стиля шрифта не повлияло на все ваше приложение.
  2. Создайте и зарегистрируйте свою собственную таблицу стилей, чтобы определить tableXFont.

Это должно указать вам правильный путь к правильной настройке шрифтов и стилей Three20

...