Смещение 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), Я бы сделал две вещи здесь

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

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

Другие вопросы по тегам