Отрегулируйте высоту UILabel в зависимости от текста - PullRequest
306 голосов
/ 15 января 2009

Предположим, у меня есть следующий текст в UILabel (длинная строка динамического текста):

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

Я хочу изменить высоту UILabel's, чтобы текст мог уместиться. Я использую следующие свойства UILabel, чтобы сделать текст внутри для переноса.

myUILabel.lineBreakMode = UILineBreakModeWordWrap;
myUILabel.numberOfLines = 0;

Пожалуйста, дайте мне знать, если я не иду в правильном направлении. Спасибо.

Ответы [ 34 ]

4 голосов
/ 27 августа 2014

А для тех, кто мигрирует на iOS 8, вот расширение класса для Swift:

extension UILabel {

    func autoresize() {
        if let textNSString: NSString = self.text {
            let rect = textNSString.boundingRectWithSize(CGSizeMake(self.frame.size.width, CGFloat.max),
                options: NSStringDrawingOptions.UsesLineFragmentOrigin,
                attributes: [NSFontAttributeName: self.font],
                context: nil)
            self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, rect.height)
        }
    }

}
4 голосов
/ 16 мая 2016

Самый простой и лучший способ, который работал для меня, - это применить ограничение высоты к метке и установить для приоритета низкий , т. Е. (250) в раскадровке.

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

4 голосов
/ 31 октября 2017

Расширение UILabel на основе этого ответа для Swift 4 и выше

extension UILabel {

    func retrieveTextHeight () -> CGFloat {
        let attributedText = NSAttributedString(string: self.text!, attributes: [NSFontAttributeName:self.font])

        let rect = attributedText.boundingRect(with: CGSize(width: self.frame.size.width, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, context: nil)

        return ceil(rect.size.height)
    }

}

Может использоваться как:

self.labelHeightConstraint.constant = self.label.retrieveTextHeight()
3 голосов
/ 06 июля 2015

Обновленный метод

+ (CGFloat)heightForText:(NSString*)text font:(UIFont*)font withinWidth:(CGFloat)width {

    CGSize constraint = CGSizeMake(width, 20000.0f);
    CGSize size;

    CGSize boundingBox = [text boundingRectWithSize:constraint
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:@{NSFontAttributeName:font}
                                                  context:nil].size;

    size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));

    return size.height;
}
2 голосов
/ 20 января 2014

Вы также можете использовать его как метод. @Pyjamasam очень верный, поэтому я просто делаю его метод. Это может быть полезно для кого-то еще

-(CGRect)setDynamicHeightForLabel:(UILabel*)_lbl andMaxWidth:(float)_width{
    CGSize maximumLabelSize = CGSizeMake(_width, FLT_MAX);

    CGSize expectedLabelSize = [_lbl.text sizeWithFont:_lbl.font constrainedToSize:maximumLabelSize lineBreakMode:_lbl.lineBreakMode];

    //adjust the label the the new height.
    CGRect newFrame = _lbl.frame;
    newFrame.size.height = expectedLabelSize.height;
    return newFrame;
}

и просто установите его так

label.frame = [self setDynamicHeightForLabel:label andMaxWidth:300.0];
2 голосов
/ 27 июня 2013
UILabel *itemTitle = [[UILabel alloc] initWithFrame:CGRectMake(10.0f, 10,100, 200.0f)];
itemTitle.text = @"aseruy56uiytitfesh";
itemTitle.adjustsFontSizeToFitWidth = NO;
itemTitle.autoresizingMask = UIViewAutoresizingFlexibleWidth;
itemTitle.font = [UIFont boldSystemFontOfSize:18.0];
itemTitle.textColor = [UIColor blackColor];
itemTitle.shadowColor = [UIColor whiteColor];
itemTitle.shadowOffset = CGSizeMake(0, 1);
itemTitle.backgroundColor = [UIColor blueColor];
itemTitle.lineBreakMode = UILineBreakModeWordWrap;
itemTitle.numberOfLines = 0;
[itemTitle sizeToFit];
[self.view addSubview:itemTitle];

используйте это здесь, все свойства используются на метке и проверьте это, увеличив текст в itemTitle.text как

itemTitle.text = @"diofgorigjveghnhkvjteinughntivugenvitugnvkejrfgnvkhv";

он покажет ответ perfetc, как вам нужно

2 голосов
/ 12 апреля 2018

Вы можете получить высоту, используя код ниже

Вы должны пройти

  1. текст 2. шрифт 3. ширина этикетки

    func heightForLabel(text: String, font: UIFont, width: CGFloat) -> CGFloat {
    
    let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.font = font
    label.text = text
    label.sizeToFit()
    
    return label.frame.height
    }
    
2 голосов
/ 01 марта 2017

Для этого в Swift3 следующий код:

 let labelSizeWithFixedWith = CGSize(width: 300, height: CGFloat.greatestFiniteMagnitude)
            let exactLabelsize = self.label.sizeThatFits(labelSizeWithFixedWith)
            self.label.frame = CGRect(origin: CGPoint(x: 20, y: 20), size: exactLabelsize)
2 голосов
/ 07 марта 2017

Это одна строка кода для получения высоты UILabel с помощью Objective-c:

labelObj.numberOfLines = 0;
CGSize neededSize = [labelObj sizeThatFits:CGSizeMake(screenWidth, CGFLOAT_MAX)];

и, используя .height, вы получите высоту метки следующим образом:

neededSize.height
2 голосов
/ 26 ноября 2015

Swift 2:

    yourLabel.text = "your very long text"
    yourLabel.numberOfLines = 0
    yourLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping
    yourLabel.frame.size.width = 200
    yourLabel.frame.size.height = CGFloat(MAXFLOAT)
    yourLabel.sizeToFit()

Интересные строки sizeToFit() в сочетании с установкой frame.size.height для максимального числа с плавающей запятой, это даст место для длинного текста, но sizeToFit() заставит его использовать только необходимый, но ВСЕГДА позвоните после установки .frame.size.height.

Я рекомендую установить .backgroundColor для целей отладки, чтобы вы могли видеть, что кадр отображается для каждого случая.

...