【问题标题】:TTStyledTextLabel offset between link and regular text when changing from default font从默认字体更改时链接和常规文本之间的 TTStyledTextLabel 偏移
【发布时间】:2010-02-14 15:51:02
【问题描述】:

我使用的是 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 代码中存在错误...

【问题讨论】:

    标签: iphone three20 ttstyledtextlabel


    【解决方案1】:

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

    去掉粗体字。

    【讨论】:

      【解决方案2】:

      在撰写本文时最新版本的 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 的行高与其余文本的行高没有区别。不过我只是猜测。

      我也计划就此提交错误报告。

      【讨论】:

      • 我试过这个,但我认为它不适用于多行文本
      【解决方案3】:

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

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

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

      【讨论】:

      • 好吧,我已经尝试过编写自己的样式表并覆盖字体方法,这具有相同的行为
      【解决方案4】:

      这样比较好,不会改变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;
      }
      

      }

      【讨论】:

        猜你喜欢
        • 2011-06-04
        • 1970-01-01
        • 2013-06-08
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多