Изменение размера UILabel в зависимости от содержимого - PullRequest
7 голосов
/ 30 августа 2011

У меня есть UILabel, его размер текста имеет свойство

title.adjustsFontSizeToFitWidth = YES;

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

sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode

из этого ответа: Как определить размер шрифта UILabel, когда -adjustsFontSizeToFitWidth установлен в YES?

Теперь я не могу понять, как заставить это работать ... это фактический код

UIFont *font = [UIFont fontWithName:@"Marker Felt" size:200];
UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, width, 20.0)];
title.text = @"this is a long title that should be resized";
title.font = font;
title.numberOfLines = 1;
title.adjustsFontSizeToFitWidth = YES;

CGFloat pointSize = 0.0;
CGSize size = [title.text sizeWithFont:font 
                           minFontSize:title.minimumFontSize 
                        actualFontSize:&pointSize 
                              forWidth:width 
                         lineBreakMode:title.lineBreakMode];
title.frame = CGRectMake(title.frame.origin.x, 
                         title.frame.origin.y, 
                         size.width, 
                         size.height);

Размер UILabel изменен неправильно, как будто размер шрифта все еще200 .. Есть какие-нибудь подсказки?Спасибо!

Ответы [ 5 ]

8 голосов
/ 30 августа 2011

У меня есть некоторый код, который вы можете использовать на моем github, посмотрите его, это категория для UILabel, вам нужно установить ширину фрейма, и когда вы можете изменить resizeToFit на UILabel, он отрегулирует высоту, чтобы соответствовать содержимому, и возвращает позицию y конца метки, чтобы вы могли настроить любой контент, появляющийся после него.

https://gist.github.com/1005520

5 голосов
/ 30 августа 2011

Я бы предложил подать это как ошибку.

Размер, возвращаемый -sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:, имеет правильную ширину, но не высота не учитывает фактический размер шрифта.

Кажется вероятным, что UILabel также имеет эту ошибку. Изменение размера метки в соответствии с высотой текста шрифтом размера, возвращаемого -sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:, приведет к неправильному вертикальному расположению текста внутри метки.

Обходной путь - рассчитать правильную высоту и изменить шрифт на метке на фактический размер шрифта:

CGFloat pointSize = 0.0f;
CGRect frame = title.frame;
frame.size = [title.text sizeWithFont:font
                          minFontSize:title.minimumFontSize
                       actualFontSize:&pointSize
                             forWidth:width
                        lineBreakMode:title.lineBreakMode];
UIFont *actualFont = [UIFont fontWithName:@"Marker Felt" size:pointSize];
CGSize sizeWithCorrectHeight = [title.text sizeWithFont:actualFont];
frame.size.height = sizeWithCorrectHeight.height;
title.frame = frame;
title.font = actualFont;
2 голосов
/ 30 августа 2011

Попробуйте создать шрифт с меньшим размером шрифта. Например:

UIFont *font = [UIFont fontWithName:@"Marker Felt" size:20];

но actualFontSize передать ссылку на CGFloat == 200.

ОБНОВЛЕНИЕ:

попробуйте тогда:

UIFont *font = [UIFont fontWithName:@"Marker Felt" size:20];
UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, width, 20.0)];
title.text = @"this is a long title that should be resized";
title.font = font;
title.numberOfLines = 1;
title.adjustsFontSizeToFitWidth = YES;

CGFloat pointSize = 0.0;
CGSize size = [title.text sizeWithFont:font minFontSize:title.minimumFontSize actualFontSize:&pointSize forWidth:width lineBreakMode:title.lineBreakMode];
title.frame = CGRectMake(title.frame.origin.x, title.frame.origin.y, size.width, size.height);
font = [UIFont fontWithName:@"Marker Felt" size:200];
title.font = font;
0 голосов
/ 29 декабря 2015

Вы пробовали intrinsicContentSize?

    myLable.numberOfLines = 0
    myLable.frame = CGRect(x: 10, y: 10, width: 300, height: lblSuperscript.intrinsicContentSize().height)
0 голосов
/ 30 августа 2011
UILabel * label = [[UILabel alloc] init];
        [label setNumberOfLines:0];
        label.text=[detailDict valueForKey:@"method"];
        [label setFont:[UIFont fontWithName:@"Georgia" size:16.0]];
        CGSize labelsize=[label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(250, 1000.0) lineBreakMode:UILineBreakModeWordWrap];
        int y=0;
        label.frame=CGRectMake(38, y, 245, labelsize.height);
        [label setBackgroundColor:[UIColor clearColor]];
        [label setTextColor:[UIColor whiteColor]];
        scrollView.showsVerticalScrollIndicator = NO;
        y+=labelsize.height;
        [scrollView setContentSize:CGSizeMake(200,y+50)];
        [scrollView addSubview:label];
        [label release];

Я думаю, что вы должны использовать этот код, и я использую метку на scrollview для большого текста, вы также можете сделать это

...