在iOS中使用自定义字体计算属性文本的大小

时间:2014-06-17 14:07:34

标签: ios7 nsattributedstring uifont rect

我想计算分配给标签的属性文本的绘图矩形,以便可以根据大小更改标签框架。

分配给标签的属性文本具有自定义字体和段落信息。

我使用了boundingRectWithSize API来计算,但是这个API没有按预期工作。如何在iOS中完成这项工作?

添加用于理解的代码

self.textLabel.attributedText = [Utilities attributedStringFromText:[dbObject valueForKey:@"content"]];

//change the frame of the label according to content
CGSize maximumSize = CGSizeMake(320,9999);

CGSize textSize= [self.textLabel.attributedText boundingRectWithSize:maximumSize
                                                             options:NSStringDrawingUsesLineFragmentOrigin
                                                             context:nil].size;

1 个答案:

答案 0 :(得分:1)

如果textLabel使用单一字体,您可以使用(使用.UsesFontLeadingNSStringDrawingUsesFontLeading选项)属性提供该字体。

夫特

let size:CGSize = self.textLabel.attributedText.string.boundingRectWithSize(
    CGSizeMake(self.textLabel.bounds.width, CGFloat.max),
    options: (.UsesLineFragmentOrigin | .UsesFontLeading),
    attributes: [NSFontAttributeName : font],
    context: nil).size

将所有内容放在一起(从属性文本中获取字体) Swift

self.textLabel.attributedText.enumerateAttribute(
    NSFontAttributeName,
    inRange: NSMakeRange(0, self.textLabel.attributedText.length),
    options: NSAttributedStringEnumerationOptions(0)) {
        (value:AnyObject!, range:NSRange, stop:UnsafeMutablePointer<ObjCBool>) -> Void in
        stop.initialize(true)
        if let font:UIFont = value as? UIFont {
            let size:CGSize = self.textLabel.attributedText.string.boundingRectWithSize(
                CGSizeMake(self.textLabel.bounds.width, CGFloat.max),
                options: (.UsesLineFragmentOrigin | .UsesFontLeading),
                attributes: [NSFontAttributeName : font],
                context: nil).size
            self.textHeight.constant = size.height // Use height
        }
}

的OBJ-C

CGSize size = [self.textLabel.attributedText.string
            boundingRectWithSize:CGSizeMake(self.textLabel.bounds.size.width,
                                            CGFLOAT_MAX)
            options:(NSStringDrawingUsesLineFragmentOrigin |
                     NSStringDrawingUsesFontLeading)
            attributes:@{NSFontAttributeName: font}
            context:nil].size;

将所有内容放在一起(从属性文本中获取字体) Obj-C

[self.textLabel.attributedText
 enumerateAttribute:NSFontAttributeName
 inRange:(NSRange){0, self.textLabel.attributedText.length}
 options:(NSAttributedStringEnumerationOptions)0
 usingBlock:^(id value, NSRange range, BOOL *stop) {
     *stop = YES;
     if( [value isKindOfClass:[UIFont class]]) {
         UIFont * font = (UIFont*)value;
         CGSize size = [self.textLabel.attributedText.string
                        boundingRectWithSize:CGSizeMake(self.textLabel.bounds.size.width,
                                                        CGFLOAT_MAX)
                        options:(NSStringDrawingUsesLineFragmentOrigin |
                                 NSStringDrawingUsesFontLeading)
                        attributes:@{NSFontAttributeName: font}
                        context:nil].size;
         self.textHeight.constant = size.height; // USe height
     }
 }];