как узнать фактическую высоту автоматического роста UILabel - PullRequest
0 голосов
/ 03 мая 2018

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

иногда Если я даю большой текст, он увеличивается до 4 строк в пользовательском интерфейсе, но когда я получаю доступ к его

frame.size.height

возвращает 21 вместо фактической высоты, которая намного больше этой.

Есть идеи, как это исправить?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Свифт

public  static func requiredHeightForLabel(text : String, font : UIFont, width : CGFloat)   -> CGFloat {

    let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: .greatestFiniteMagnitude))//UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.font = font
    label.text = text

    label.sizeToFit()
    return label.frame.height
}

объектив c

+(CGFloat)getLabelHeightForString:(NSString *)string font:(UIFont *)font 
{
CGSize size = CGSizeMake(lablwidth, MAXFLOAT);

NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];

CGSize boundingBox = [string boundingRectWithSize:size

                                          options:NSStringDrawingUsesLineFragmentOrigin

                                       attributes:@{NSFontAttributeName:font}

                                          context:context].size;

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

return size.width;

}
0 голосов
/ 03 мая 2018

В вашем View Controller вы можете использовать метод, который уведомит вас о завершении макета:

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        print("frame = \(label.frame)")
    }
...