我在使用UILabel attributedText
时遇到了麻烦,我正在考虑创建一个UIView子类,在drawRect
中手动呈现其属性字符串。
我遇到的问题的要点是故事板文件中定义的UILabels似乎总是在运行时呈现大小为17.0的字体。我已经尝试了很多黑客来解决这个问题,但没有任何效果。无论我做什么,标签的字体大小都保持在17.0。
我尝试的第一件事,我认为是最自然的解决方案,就是直接在故事板中修改字体大小。标签内容的故事板内预览已正确更新,但在运行时字体已重置为17.0。
我接下来尝试的是在运行时调整字体大小。这里观察到一些有趣的结果:(a)在查询字体大小时,标签的attributionText属性报告了正确的字体大小,但它仍然呈现为默认大小17.0。将属性文本设置为其他内容无效。此外,更改属性文本字体是不成功的(我尝试了许多不同的东西,因为我不确定它是否只是size
未能设置,但显然NSFontAttributeName
下的所有内容都是不可变的
我还尝试用禁用用户交互的UITextView替换UILabel,因为我认为这可能是标签特有的错误。文本视图的归属文本再次证明在运行时是不可变的,至少从渲染角度来看。
我对可能导致此问题的原因有很多怀疑。我很好奇它是否与标签视图在UITableViewCell子类中的事实有关,但我没有时间运行大量实验。我通常没有充分利用带有属性文本的UILabel,但我没有在这里或其他地方找到有关已知问题的证据。
我已尽最大努力浏览了所有API,尝试禁用某些自动换行设置,并尝试将 Plain 标签的字体大小设置为14.0 之前将其标记为归因,因为我认为更高级别的属性可能会覆盖较低级别的归属文本设置。再一次,这种方法没有成功。
有没有其他人经历过这样的事情?
与此同时,我将继续实现我自己的属性标签作为UIView子类。如果这最终成为目前唯一可行的解决方案,我将发布代码。
答案 0 :(得分:1)
我不知道您是如何在标签中设置文字的,但如果您使用其字体属性设置为您想要的属性字符串进行设置,则可以使用。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
RDCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
NSString *plain = self.theData[indexPath.row];
cell.label.attributedText = [[NSAttributedString alloc] initWithString:plain attributes:@{NSFontAttributeName:[UIFont fontWithName:@"Snell Roundhand" size:24]}];
return cell;
}
当我尝试在故事板中设置标签以使用属性文本时,我看到了同样的问题。
答案 1 :(得分:0)
如上所述,这是我最终使用的解决方案。它在各个方面都不像UILabel那样通用(不支持缩小字体等),但结果证明它适合我的需要。
@interface DHAttributedLabel : UIView
@property (nonatomic, strong) NSAttributedString * attributedText;
@end
@implementation DHAttributedLabel
-(id) initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
[self setBackgroundColor:[UIColor clearColor]];
}
return self;
}
-(void) drawRect:(CGRect)rect {
CGRect boundingRect = [_attributedText
boundingRectWithSize : CGSizeMake(rect.size.width, CGFLOAT_MAX)
options : NSStringDrawingUsesLineFragmentOrigin
context : nil
];
CGRect drawInRect = rect;
CGFloat dy = .5 * (rect.size.height - boundingRect.size.height);
if (dy > 0) { // center vertically if appropriate
drawInRect.origin.y += dy; // (truncate bottom if the text is too big)
}
[_attributedText drawInRect:drawInRect];
}
@end
答案 2 :(得分:0)
我通过在UITableViewDataSource attributedText
方法中设置cellForRowAtIndexPath:
来解决同样的问题。似乎如果在委托返回单元格之前通过IBOutlet设置attributedText
属性,则某些attributionText属性将丢失(如属性substring的字体大小),而其他属性则保留(如属性substring的文本颜色)。
在我看来是某种UIKit问题。
答案 3 :(得分:0)
就我而言,它在tableView(_:willDisplay:forRowAt:)
中设置attributedText
时有效。
答案 4 :(得分:0)
具有HTML内容的属性文本,表示它们在其内容中指定了自己的字体。
要增加标签属性文本的大小,您需要通过CSS覆盖html字体。
这里是您获得的内容,即HTMl内容。
<html><body><font face='Helvetica' size='3'>There is no description.</html></body>
如您所见,它们在HTML内容中具有给定的大小,您需要添加额外的属性来覆盖这种字体。
<style>
html * {font-size: 25.0pt !important;}
</style>
<html><body><font face='Helvetica' size='13'>There is no description.</html></body>
通过添加此CSS,尝试获取属性String,在Label中设置。
希望这会将字体大小增加到25.0。