Подтвердить что ты не робот

Как получить размер NSString

A "quicky": как я могу получить размер (ширину) NSString?

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

Я как бы застрял.

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

4b9b3361

Ответ 1

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

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

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 строку (с использованием того же шрифта и размера). Если он больше, вам нужно будет отрезать текст. Обратите внимание, что вы должны добавить... в строку перед тем, как вы ее снова проверите (добавление... может снова нажать ее над лимитом).

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

Ответ 2

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

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

sizeWithFont:constrainedToSize:lineBreakMode 

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

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

NSString *name = @"APPLE";

CGSize size = [name sizeWithAttributes:@{NSFontAttributeName:font}];