Iphone 从默认字体更改时链接和常规文本之间的TTSTYLEDTEXTLABLE偏移量

Iphone 从默认字体更改时链接和常规文本之间的TTSTYLEDTEXTLABLE偏移量,iphone,three20,ttstyledtextlabel,Iphone,Three20,Ttstyledtextlabel,我正在使用Three20 TTStyledTextLabel,当我将默认字体(Helvetica)更改为其他字体时,它会在链接和常规文本之间创建某种高度差 以下代码演示了我的问题: #import <Three20/Three20.h> @interface TestController : UIViewController { } @end @implementation TestController -(id)init{

我正在使用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
#导入
@接口TestController:UIViewController{
}
@结束
@实现测试控制器
-(id)init{
self=[super init];
TTStyledTextLabel*label=[[TTStyledTextLabel alloc]initWithFrame:CGRectMake(0,0,320,230)]自动释放];
label.text=[ttstyledtexttextfromxhtml:@“text”换行符:是URL:YES];
[label setFont:[UIFont systemFontOfSize:16];
[[self view]addSubview:label];
TTStyledTextLabel*label2=[[TTStyledTextLabel alloc]initWithFrame:CGRectMake(0,230,320,230)]自动释放];
label2.text=[TTStyledText-textFromXHTML:@“text2”换行符:是URL:是];
[label2 setFont:[UIFont fontWithName:@“HelveticaNeue”大小:16];
[[self-view]addSubview:label2];
回归自我;
}
@结束

在屏幕截图中,您可以看到第一个链接已对齐,而第二个链接未对齐

我怎么修理它?我认为TTStyledTextLabel代码中有一个bug…

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

  • 创建一个覆盖
    initWithFrame
    方法的类别。除了将
    self.font=TTSTYLEVAR(font)
    重命名为类似于
    tableXFont
    的其他名称外,所有内容都保持不变,以便更改字体样式不会影响整个应用程序
  • 制作并注册您自己的样式表,以便定义
    tableXFont
  • 这将为您提供正确的路径,以正确的方式进行three20字体和样式定制

    我刚刚评论了
    -(void)offsetFrame:(TTStyledFrame*)frame by:(CGFloat)y
    (TTStyledLayout.m:87)out,它成功了。当然,它可能会破坏其他东西

    编辑: 我还注释掉了以下代码

    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.downer))

    [self-offsetFrame:frame-by:(_-lineHeight-(frame.height/*-font.downer*/)]

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

    在盯着TT代码看了一段时间后,我相信你的问题只会在一行上有URL的时候出现,因为URL粗体会增加一些“行高”ivar。如果您不想fork three20,您可能只需要更改样式表,以确保URL的行高与文本其余部分的行高相同。不过,我只是在猜测


    我也计划就此提交一份bug报告。

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

    }

    好吧,我已经尝试过编写自己的样式表并重写字体方法,这与我尝试过的行为相同,但我认为它对多行文本不起作用