Как получить размер NSString - PullRequest
29 голосов
/ 19 апреля 2010

«Быстрый»: как я могу получить размер (ширину) строки NSSt?

Я пытаюсь увидеть, если ширина строки строки, чтобы увидеть, если она больше, чем заданная ширина экрана, в случае, когда я должен "обрезать" его и добавить его с "...", получая обычное поведение UILabel. string.length не сработает, поскольку AAAAAAAA и iiiiii имеют одинаковую длину, но разные размеры (например).

Я немного застрял.

Большое спасибо.

Ответы [ 4 ]

38 голосов
/ 19 апреля 2010

Это другой подход. Определите минимальный размер текста, чтобы он не занимал более одной строки. Если он переносится на одну строку, вы можете узнать это, используя высоту.

Вы можете использовать этот код:

CGSize maximumSize = CGSizeMake(300, 9999);
NSString *myString = @"This is a long string which wraps";
UIFont *myFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize myStringSize = [myString sizeWithFont:myFont 
                           constrainedToSize:maximumSize 
                               lineBreakMode:self.myLabel.lineBreakMode];

300 - ширина экрана с небольшим пространством для полей. Вам следует подставить собственные значения для шрифта и размера, а также для lineBreakMode, если вы не используете IB.

Теперь myStringSize будет содержать height, который вы можете проверить по высоте чего-то, что вы знаете, имеет высоту всего 1 строчку (используя тот же шрифт и размер). Если он больше, вам нужно будет вырезать текст. Обратите внимание, что вы должны добавить ... к строке, прежде чем проверять ее снова (добавление ... может привести к ее превышению).

Поместите этот код в цикл, чтобы вырезать текст, затем снова проверьте правильность высоты.

12 голосов
/ 25 мая 2015

Используйте метод ниже.

Objective-C

- (CGSize)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font {
    CGSize size = CGSizeZero;
    if (text) {
        CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:font } context:nil];
        size = CGSizeMake(frame.size.width, frame.size.height + 1);
    }
    return size;
}

Swift 3.0

func findHeight(forText text: String, havingWidth widthValue: CGFloat, andFont font: UIFont) -> CGSize {
    var size = CGSizeZero
    if text {
        var frame = text.boundingRect(withSize: CGSize(width: widthValue, height: CGFLOAT_MAX), options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
        size = CGSize(width: frame.size.width, height: frame.size.height + 1)
    }
    return size
}
4 голосов
/ 19 апреля 2010

Вам необходимо использовать Core Graphics для измерения строки в соответствии с заданным шрифтом и размером. См. Ответы на Измерение ширины в пикселях строки для прохождения.

3 голосов
/ 28 сентября 2015
sizeWithFont:constrainedToSize:lineBreakMode 

устарела.Используйте приведенный ниже фрагмент кода,

UIFont *font=[UIFont fontWithName:@"Arial" size:16.f];

NSString *name = @"APPLE";

CGSize size = [name sizeWithAttributes:@{NSFontAttributeName:font}];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...