如何获得NSString的宽度?

时间:2010-08-07 08:06:00

标签: objective-c cocoa nsstring

我试图获得NSString的宽度(例如NSString * myString = @“hello”)。有没有办法做到这一点?

感谢。

12 个答案:

答案 0 :(得分:58)

这是一种相对简单的方法。只需使用适当的字体创建一个NSAttributedString并询问其大小:

- (CGFloat)widthOfString:(NSString *)string withFont:(NSFont *)font {
     NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil];
     return [[[NSAttributedString alloc] initWithString:string attributes:attributes] size].width;
 }

答案 1 :(得分:14)

UIFont * font = [UIFont systemFontOfSize:15];

CGSize stringSize = [aString sizeWithFont:font]; 

CGFloat width = stringSize.width;

答案 2 :(得分:3)

发送字符串sizeWithAttributes:消息,传递包含您要测量字符串的属性的字典。

答案 3 :(得分:3)

我不知道你是否想在可可触摸中使用它。如果是,那么:

- (CGFloat)widthOfString:(NSString *)string withFont:(NSFont *)font {
     NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil];
     return [[[NSAttributedString alloc] initWithString:string attributes:attributes] size].width;
 }

不会工作。

在cocoa touch中,你必须添加coretext框架并导入标题 并编写如下代码:

UIFont *font = [UIFont fontWithName:@"HelveticaNeue-BoldItalic" size:DEFAULT_FONT_SIZE];
//    NSLog(@"%@", NSFontAttributeName);
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, (NSString     *)kCTFontAttributeName, nil];

但是,GEE !!!!!

NSMutableAttributedString *as = [[NSMutableAttributedString alloc] initWithString:self.caption attributes:attributes];
[as size].width;

NSMutableAttributedString中没有这个方法的大小!

最后,这会起作用

[self.caption sizeWithFont:font].width

答案 4 :(得分:2)

至于ios 7及以上这是正确的方法:

NSString * buttonTitle = @"demo title";
CGSize stringSize = [buttonTitle sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}];

答案 5 :(得分:2)

使用UILabel的属性字符串:

- (CGSize)getStringSizeWithText:(NSString *)string font:(UIFont *)font{

    UILabel *label = [[UILabel alloc] init];
    label.text = string;
    label.font = font;

    return label.attributedText.size;
}

答案 6 :(得分:2)

这适用于 iOS 14.5

目标 C

定义属性:

 NSDictionary *attributes = @{
            NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:25],
            NSStrokeWidthAttributeName: @(0),
            NSStrokeColorAttributeName: [UIColor blackColor]
    };

获取宽度和高度:

- (CGFloat)widthOfString:(NSString *)string {
    CGSize stringSize = [string sizeWithAttributes:attributes];
    return stringSize.width;
}

- (CGFloat)heightOfString:(NSString *)string {
    CGSize stringSize = [string sizeWithAttributes:attributes];
    return stringSize.height;
}

答案 7 :(得分:0)

抱歉,我的问题不够详细,并不完全是我想要做的。我正在使用文本存储,布局管理器和文本容器。解决方案是使用布局管理器来确定绑定rect的矩形。这是代码。

NSTextStorage *textStorage = [[NSTextStorage alloc] initWithString:@"hello"];
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
NSTextContainer *textContainer = [[NSTextContainer alloc] init];

[layoutManager addTextContainer:textContainer];
[textContainer release];

[textStorage addLayoutManager:layoutManager];
[layoutManager release];

//Figure out the bounding rectangle
NSRect stringRect = [layoutManager boundingRectForGlyphRange:NSMakeRange(0, [layoutManager numberOfGlyphs]) inTextContainer:textContainer];

答案 8 :(得分:0)

UIKit对NSString有很好的补充,使得sizeWithAttributes更轻一点:

CGSize titleSize = [title sizeWithFont:titleFont 
                     constrainedToSize:contentCellSize 
                         lineBreakMode:UILineBreakModeWordWrap];

答案 9 :(得分:0)

当使用Objective C桥时,这是Stephen在Clozure Common Lisp中的解决方案。我在搜索解决方案时遇到了这个帖子,我刚刚重写了斯蒂芬的版本,这对我来说很好。使用Clozure的其他人可能会觉得这很有帮助:

(defun string-width (str font)
  (let* ((dict (#/dictionaryWithObjectsAndKeys: ns:ns-mutable-dictionary
                font #$NSFontAttributeName
                ccl:+null-ptr+))
         (attr (#/initWithString:attributes: (#/alloc ns:ns-attributed-string)
                (ccl::%make-nsstring str)
                dict))
         (size (#/size attr)))
    (ns:ns-size-width size)))

答案 10 :(得分:0)

这将起作用。你可以试试看。

NSDictionary *attrDict = @{NSFontAttributeName : [GenericUtility getOpenSansRegularFontSize:12]};
CGSize stringBoundingBox = [selectedReservationModel.DateLabel sizeWithAttributes: attrDict];
    lblDeliveryDateWidth = stringBoundingBox.width;

答案 11 :(得分:-1)

万一你想知道如何检查标签大小,你应该使用UIFont,而不是NSFont(甚至不确定是否存在)