Как настроить размер ярлыка, чтобы он соответствовал длине текста

Я искал решение этого в прошлых QAs, но не смог найти правильный. Кто-нибудь знает, как настроить размер UILabel динамически, чтобы соответствовать длине текста?
Я загрузил снимок экрана из того, чего не хочу (1-я строка) и того, что хочу (2-я строка).
Я был бы признателен за любые подсказки, советы или образцы кода. Спасибо. enter image description here

Ответ 1

То, что вы ищете, это метод UILabel sizeToFit

Я могу попытаться объяснить вам, но лучшим ответом на то, как работать с UILabel, является то, что: fooobar.com/questions/460/...

Ответ 2

Xcode 8 и iOS 10

Это довольно легко сделать с Auto Layout. Не нужно ничего делать в коде.

введите описание изображения здесь

Использовать автоматический макет

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

введите описание изображения здесь

Вот как выглядят ограничения:

введите описание изображения здесь

Код

В коде нет ничего особенного. Не нужно использовать sizeToFit или что-то в этом роде.

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var labelOne: UILabel!
    @IBOutlet weak var labelTwo: UILabel!
    @IBOutlet weak var labelThree: UILabel!

    @IBAction func changeTextButtonTapped(_ sender: UIButton) {

        labelOne.text = "David"
        labelTwo.text = "met"
        labelThree.text = "her"
    }
}

Примечания

  • Этот ответ был протестирован с помощью Xcode 8, iOS 10 и Swift 3.
  • См. мой другой ответ, если вы хотите изменить размер нескольких строк.
  • Благодаря этому ответу для установки меня на правильный трек.

Ответ 3

Использовать этот расширенный класс UILabel:

//
//  UILabelExtended.h

//
//  Created by Prateek on 6/18/11.



#import <Foundation/Foundation.h>

/*  **********************************************************************************************
        This class inherit the class UILabel and extend the features of UILabel. 
    ********************************************************************************************** */
@interface UILabelExtended : UILabel {
   __unsafe_unretained id  customDelegate;
    id  objectInfo;
    SEL selector;
}

@property (nonatomic,assign) SEL selector;;
@property (nonatomic,assign) id  customDelegate;
@property (nonatomic,retain) id  objectInfo;
@end

@interface UILabel(UILabelCategory)
- (void)setHeightOfLabel;
- (void)setWidthOfLabel;
- (void)setHeightOfLabelWithMaxHeight:(float)maxHeight;
- (void)setWidthOfLabelWithMaxWidth:(float)maxWidth ;
@end

UILabelExtended.m

//
//  Created by Prateek on 6/18/11.

//

#import "UILabelExtended.h"


@implementation UILabelExtended
@synthesize selector,customDelegate, objectInfo;

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if(self.selector)
        if([self.customDelegate respondsToSelector:self.selector]) {
            [self.customDelegate performSelector:self.selector withObject:self];
            return;
        }
}

- (void)dealloc {

    self.customDelegate = nil;
    self.selector = NULL;
    self.objectInfo = nil;
}
@end


@implementation UILabel(UILabelCategory)

- (void)setHeightOfLabel {
    UILabel* label = self;

    //get the height of label content
    CGFloat height = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, 99999) lineBreakMode:NSLineBreakByWordWrapping].height;
    //set the frame according to calculated height
    CGRect frame = label.frame;
    if([label.text length] > 0) {

        frame.size.height = height;
    } 
    else {
        frame.size.height = 0;
    }
    label.frame = frame;
}


- (void)setWidthOfLabel {
    UILabel* label = self;

        //get the height of label content
    CGFloat width = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(99999, label.bounds.size.height) lineBreakMode:NSLineBreakByWordWrapping].width;
        //set the frame according to calculated height
    CGRect frame = label.frame;
    if([label.text length] > 0) {

        frame.size.width = width+5;
    } 
    else {
        frame.size.width = 0;
    }
    label.frame = frame;
}

- (void)setHeightOfLabelWithMaxHeight:(float)maxHeight {
    UILabel* label = self;

    //get the height of label content
    CGFloat height = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, maxHeight) lineBreakMode:NSLineBreakByWordWrapping].height;
    //set the frame according to calculated height
    CGRect frame = label.frame;

    if([label.text length] > 0) {
        if (height > maxHeight) {
            frame.size.height = maxHeight;
        }
        else {
            frame.size.height = height;
        }

    } 
    else {
        frame.size.height = 0;
    }
    label.frame = frame;
}

- (void)setWidthOfLabelWithMaxWidth:(float)maxWidth  {
    UILabel* label = self;

    //get the height of label content
    CGFloat width = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(99999, label.bounds.size.height) lineBreakMode:NSLineBreakByWordWrapping].width;
    //set the frame according to calculated height
    CGRect frame = label.frame;
    if([label.text length] > 0) {

        if (width > maxWidth) {
            frame.size.width = maxWidth;
        }
        else {
            frame.size.width = width;
        }
    } 
    else {
        frame.size.width = 0;
    }
    label.frame = frame;
}
@end

Способы использования: 1) установить текст UILabel2) [yourLBLObj setHeightOfLabel]; или [yourLBLObj setWidthOfLabel];Он автоматически устанавливает высоту или ширину в соответствии с текстом.

Ответ 4

вы просто вычисляете ширину UILabel для размера строки, попробуйте этот простой код для набора UILabel size

   // Single line, no wrapping;
    CGSize expectedLabelSize = [string sizeWithFont:yourFont];
 //  you get width,height in expectedLabelSize;
//expectedLabelSize.width,expectedLabelSize.height

Ответ 5

попробуйте это

        NSString *text1 = [NSString stringWithFormat:@"%@",commentText];
        CGSize constraint1 = CGSizeMake(280, 2000);
        CGSize size1 = [text1 sizeWithFont:[UIFont systemFontOfSize:12] constrainedToSize:constraint1 lineBreakMode:UILineBreakModeWordWrap];

        UILabel *lblComment = [[UILabel alloc] initWithFrame:CGRectMake(posx,posy,size1.width,size1.height)] ;
        lblComment.lineBreakMode = UILineBreakModeWordWrap;
        lblComment.numberOfLines = size1.height/15;
        [lblComment setFont:[UIFont systemFontOfSize:12]];
        lblComment.text = text1;
        lblComment.tag = shareObjC.userId;
            [lblComment setNeedsDisplay]

Ответ 6

Вы можете использовать этот кусок кода для расчета ширины метки и установки его

   CGSize expectedLabelSize = [name sizeWithFont:yourfont constrainedToSize:maximumLabelSize]; 

//вы можете получить ширину ширины ширины от expectedLabelSize и соответственно установить

Ответ 7

В настоящее время я работаю над IOS-8, и есть небольшие изменения, которые я сделал для ответа @Suragch (нужно использовать автомасштабирование, чтобы сделать эту работу)

Ниже приведен шаг и снимок экрана в результатах:

  • Поместите текстовое представление внутри UIView, а не непосредственно внутри содержимого в раскадровке
  • Отключить прокрутку текста из раскадровки
  • Добавить ведущие и верхние ограничения, которые я добавил для просмотра ниже скриншот (ограничение на трейлинг необязательно, но я добавил)

Нет необходимости добавлять код в swift, это может быть сделано в самой раскадровке.

Результат: введите описание изображения здесь

Ответ 8

Все, что вам нужно, просто введите 2 строки кода

lbl1.numberOfLines = 0
    lbl1.sizeToFit()

Он будет управлять шириной ярлыка в соответствии с его содержимым

Надеюсь, это поможет другим :)