带有属性文本的UITableViewCell UILabel似乎有固定字体(iOS 7/8)

时间:2014-11-08 18:19:50

标签: objective-c uilabel nsattributedstring

我在使用UILabel attributedText时遇到了麻烦,我正在考虑创建一个UIView子类,在drawRect中手动呈现其属性字符串。

我遇到的问题的要点是故事板文件中定义的UILabels似乎总是在运行时呈现大小为17.0的字体。我已经尝试了很多黑客来解决这个问题,但没有任何效果。无论我做什么,标签的字体大小都保持在17.0。

  1. 我尝试的第一件事,我认为是最自然的解决方案,就是直接在故事板中修改字体大小。标签内容的故事板内预览已正确更新,但在运行时字体已重置为17.0。

  2. 我接下来尝试的是在运行时调整字体大小。这里观察到一些有趣的结果:(a)在查询字体大小时,标签的attributionText属性报告了正确的字体大小,但它仍然呈现为默认大小17.0。将属性文本设置为其他内容无效。此外,更改属性文本字体是不成功的(我尝试了许多不同的东西,因为我不确定它是否只是size未能设置,但显然NSFontAttributeName下的所有内容都是不可变的

  3. 我还尝试用禁用用户交互的UITextView替换UILabel,因为我认为这可能是标签特有的错误。文本视图的归属文本再次证明在运行时是不可变的,至少从渲染角度来看。

  4. 我对可能导致此问题的原因有很多怀疑。我很好奇它是否与标签视图在UITableViewCell子类中的事实有关,但我没有时间运行大量实验。我通常没有充分利用带有属性文本的UILabel,但我没有在这里或其他地方找到有关已知问题的证据。

    我已尽最大努力浏览了所有API,尝试禁用某些自动换行设置,并尝试将 Plain 标签的字体大小设置为14.0 之前将其标记为归因,因为我认为更高级别的属性可能会覆盖较低级别的归属文本设置。再一次,这种方法没有成功。

    有没有其他人经历过这样的事情?

    与此同时,我将继续实现我自己的属性标签作为UIView子类。如果这最终成为目前唯一可行的解​​决方案,我将发布代码。

5 个答案:

答案 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。