Iphone 从默认字体更改时链接和常规文本之间的TTSTYLEDTEXTLABLE偏移量
我正在使用Three20 TTStyledTextLabel,当我将默认字体(Helvetica)更改为其他字体时,它会在链接和常规文本之间创建某种高度差 以下代码演示了我的问题:Iphone 从默认字体更改时链接和常规文本之间的TTSTYLEDTEXTLABLE偏移量,iphone,three20,ttstyledtextlabel,Iphone,Three20,Ttstyledtextlabel,我正在使用Three20 TTStyledTextLabel,当我将默认字体(Helvetica)更改为其他字体时,它会在链接和常规文本之间创建某种高度差 以下代码演示了我的问题: #import <Three20/Three20.h> @interface TestController : UIViewController { } @end @implementation TestController -(id)init{
#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
-(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;
}
}好吧,我已经尝试过编写自己的样式表并重写字体方法,这与我尝试过的行为相同,但我认为它对多行文本不起作用