1

我正在使用 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

4 回答 4

2

我刚刚评论- (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;
//    }
}

摆脱粗体字体。

于 2010-02-19T01:38:51.767 回答
1

在撰写本文时最新版本的three20 中,在我看来问题出在TTStyledLayout:345。

具体来说,改变:

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

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

...似乎解决了这个问题。

在盯着 TT 代码一段时间后,我相信你的问题只有在一行中有 URL 时才会出现,因为 URL 粗体会夸大一些“行高”ivar。如果您不想分叉three20,您可能只需更改样式表以确保URL 的行高与其余文本的行高没有区别。不过,我只是在猜测。

我也计划提交一份关于此的错误报告。

于 2010-07-30T01:25:15.513 回答
0

如果您查看源代码,字体是使用样式设置的:self.font = TTSTYLEVAR(font)。我会在这里做两件事

  1. 创建一个覆盖该initWithFrame方法的类别。除了重命名self.font = TTSTYLEVAR(font)为其他名称外,其他所有内容都保持不变tableXFont,这样更改字体样式就不会影响您的整个应用程序。
  2. 制作并注册您自己的样式表,以便tableXFont定义。

这应该让您走上正确的道路,以正确的方式进行 three20 字体和样式自定义

于 2010-02-14T16:08:20.280 回答
0

这样更好,所以不会改变 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;
}

}

于 2012-03-28T18:39:54.820 回答