代码之家  ›  专栏  ›  技术社区  ›  David

如何获得字符串的宽度?

  •  29
  • David  · 技术社区  · 14 年前

    10 回复  |  直到 14 年前
        1
  •  60
  •   Stephen Poletto    14 年前

    这里有一个相对简单的方法。只需创建一个具有适当字体的nsattributestring并询问其大小:

    - (CGFloat)widthOfString:(NSString *)string withFont:(NSFont *)font {
         NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil];
         return [[[NSAttributedString alloc] initWithString:string attributes:attributes] size].width;
     }
    
        2
  •  14
  •   joker    11 年前
    UIFont * font = [UIFont systemFontOfSize:15];
    
    CGSize stringSize = [aString sizeWithFont:font]; 
    
    CGFloat width = stringSize.width;
    
        3
  •  4
  •   Amr Lotfy    8 年前

    使用UILabel的属性字符串:

    - (CGSize)getStringSizeWithText:(NSString *)string font:(UIFont *)font{
    
        UILabel *label = [[UILabel alloc] init];
        label.text = string;
        label.font = font;
    
        return label.attributedText.size;
    }
    
        4
  •  3
  •   Peter Hosey    14 年前

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

        5
  •  3
  •   Bruce Lee    11 年前

    我不知道你是否打算用这个来接触可可粉。如果是,那么:

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

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

    但是,天哪!!!!!

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

    NSMutableAttributeString中没有此方法的大小!

    最后,这是可行的

    [self.caption sizeWithFont:font].width
    
        6
  •  2
  •   Eli    9 年前

    对于ios 7及更高版本,这是正确的方法:

    NSString * buttonTitle = @"demo title";
    CGSize stringSize = [buttonTitle sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}];
    
        7
  •  0
  •   David    14 年前

    对不起,我的问题不够详细,也不完全是我想做的。我使用的是文本存储,布局管理器和文本容器。解决方案是使用布局管理器来确定矩形的边界。这是密码。

    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
  •   Mullzk    14 年前

    CGSize titleSize = [title sizeWithFont:titleFont 
                         constrainedToSize:contentCellSize 
                             lineBreakMode:UILineBreakModeWordWrap];
    
        9
  •  0
  •   Clayton Stanley    12 年前

    下面是Stephen在Clozure Common Lisp中使用Objective C桥时的解决方案。我在寻找解决方案时遇到了这篇文章,我只是重写了斯蒂芬的版本,对我来说效果很好。其他使用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
  •   sametytmz    4 年前

    NSDictionary *attrDict = @{NSFontAttributeName : [GenericUtility getOpenSansRegularFontSize:12]};
    CGSize stringBoundingBox = [selectedReservationModel.DateLabel sizeWithAttributes: attrDict];
        lblDeliveryDateWidth = stringBoundingBox.width;
    
        11
  •  -1
  •   Wilson Soethe Cursino    10 年前

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