Как получить ширину строки NSString? - PullRequest
30 голосов
/ 07 августа 2010

Я пытаюсь получить ширину строки NSString (например, NSString * myString = @ "hello").Есть ли способ сделать это?

Спасибо.

Ответы [ 10 ]

58 голосов
/ 07 августа 2010

Вот сравнительно простой подход. Просто создайте NSAttributedString с соответствующим шрифтом и спросите его размер:

- (CGFloat)widthOfString:(NSString *)string withFont:(NSFont *)font {
     NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil];
     return [[[NSAttributedString alloc] initWithString:string attributes:attributes] size].width;
 }
14 голосов
/ 30 января 2013
UIFont * font = [UIFont systemFontOfSize:15];

CGSize stringSize = [aString sizeWithFont:font]; 

CGFloat width = stringSize.width;
3 голосов
/ 31 января 2013

Я не знаю, если вы собираетесь использовать это в прикосновении какао. если это так, то:

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

не будет работать.

в какао Touch, вы должны добавить coretext framework и импортировать заголовок и напишите свой код так:

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;

размер этого метода в NSMutableAttributedString отсутствует!

наконец, это будет работать

[self.caption sizeWithFont:font].width
3 голосов
/ 07 августа 2010

Отправьте в строку сообщение sizeWithAttributes:, передав словарь, содержащий атрибуты, с которыми вы хотите измерить строку.

2 голосов
/ 15 ноября 2016

Использование атрибутной строки UILabel:

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

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

    return label.attributedText.size;
}
2 голосов
/ 01 ноября 2015

как для ios 7 и выше, это правильный путь:

NSString * buttonTitle = @"demo title";
CGSize stringSize = [buttonTitle sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}];
0 голосов
/ 31 июля 2014

На всякий случай, если вам интересно, как проверить размер метки, вы должны использовать UIFont вместо NSFont (даже не уверен, существует ли)

0 голосов
/ 14 июня 2012

Вот решение Стивена в 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)))
0 голосов
/ 07 августа 2010

UIKit имеет хорошее дополнение к NSString, благодаря чему sizeWithAttributes: немного светлее:

CGSize titleSize = [title sizeWithFont:titleFont 
                     constrainedToSize:contentCellSize 
                         lineBreakMode:UILineBreakModeWordWrap];
0 голосов
/ 07 августа 2010

Извините, мой вопрос не был достаточно подробным и не совсем то, что я пытаюсь сделать. Я использую хранилище текста, менеджер макета и текстовый контейнер. Решением является использование диспетчера макетов для определения прямоугольника, который ограничивает прямоугольник. Вот код

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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...