UILabel sizeToFit не работи правилно. Използването на setNumberOfLines не работи. Необходима е функция за променлива височина, за да работи

Опитвам се да покажа текст с променлива височина чрез UILabel.
Настроих всичко чрез комбинация от сценария на Xcode и кодиране директно във файловете за изпълнение.

Ето кода:

CGRect labelFrame = CGRectMake(20, 20, 280, 800);
descriptionLabel.frame = labelFrame;
NSString *description = self.spell[@"description"];
descriptionLabel.text = description;
[descriptionLabel setNumberOfLines:0];
[descriptionLabel sizeToFit];

Опитах се да променя функциите за обвиване на думи и се опитах да играя с много различни настройки, но без резултат.

Има ли нещо конкретно, което трябва да се направи в сценария?
Важна ли е структурата на моя изглед->етикет?
Имам го така, че етикетите са в изглед (който заема целия екран).


person user2050812    schedule 07.02.2013    source източник
comment
Разгледайте тази публикация за задаване на многоредови етикети   -  person Jonathan Cichon    schedule 07.02.2013


Отговори (6)


Използвам SWIFT и се сблъсках със същия проблем. Поправих го, след като добавих layoutIfNeeded(). Моят код е както следва:

self.MyLabel.sizeToFit()
self.MyLabel.layoutIfNeeded()
person Ken Seow    schedule 24.03.2016

Не е необходимо да изчислявате височините ръчно. За променлива височина задайте височината на етикета на 0, преди да извикате sizeToFit, като това.

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 280, 0)];
label.numberOfLines = 0;
label.text = @"Some long piece of text...";

[label sizeToFit];
person 1actobacillus    schedule 09.12.2013
comment
Разработвам за iOS 7 и това не работи. Може би има обстоятелства, при които го прави, но в моя случай, когато всичко е настроено така, както го имате, плюс фонов цвят и по-голям шрифт, не работи. Той просто добавя многоточието. - person d2burke; 01.04.2014
comment
Задаването на височината на етикета на 0 в сценария го направи за мен в swift. Задаването на рамката в кода няма ефект. - person hablema; 18.09.2014

Ето моето решение за всеки проблем като вашия (динамична височина):

NSString *description = @"Some text";

CGSize dynamicSize = [[description sizeWithFont:[UIFont fontWithName:@"FONT_NAME" size:14] constrainedToSize:CGSizeMake(300, 10000)]; //the width should be the one you need and just put in a very big height so that anything you would put in here would fit
//dynamicSize is now the exact size you will need, with the fixed width and the height just enough so that all the text will fit.

UILabel *someLabel = [[UILabel alloc] initWithFrame:CGRectMake:(0, 0, dynamicSize.width, dynamicSize.height)];
someLabel.font = YOUR_FONT;
someLabel.numberOfRows = 10 //You should calculate how many rows you need by dividing dynamicSize.height to the height of one row (should also take into account the padding that your UILabel will put between rows

Това според мен е най-сигурният начин за определяне на необходимата височина. Освен това, доколкото знам, извикването на sizeToFit няма да промени неговия размер, ако вече е достатъчно голям, за да побере целия текст. (няма да го направи по-малък... просто по-голям, ако трябва, но няма да добави повече редове)

person Andrei Filip    schedule 07.02.2013

Не изглежда, че задавате lineBreakMode.

Получих някакъв код от stackoverflow преди време и го поставих в категория, можете да го намерите тук: http://www.notthepainter.com/multi-line-uilabel/

Но ако искате само кода, ето го:

@interface UILabel (BPExtensions)
- (void)sizeToFitFixedWidth:(CGFloat)fixedWidth;
@end
 
@implementation UILabel (EnkiExtensions)
- (void)sizeToFitFixedWidth:(CGFloat)fixedWidth
{
    if (fixedWidth < 0) {
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, 0);
    } else {
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, fixedWidth, 0);
    }
    self.lineBreakMode = UILineBreakModeWordWrap;
    self.numberOfLines = 0;
    [self sizeToFit];
}
@end

Вие го наричате така:

helpLabel_.text = @"You need to cut the blue wire and ground the red wire. Do not cut the red wire and ground the blue wire, that would be bad.";
[helpLabel_ sizeToFitFixedWidth: desiredWidth ];
person Paul Cezanne    schedule 07.02.2013

Опитах се да създам същото нещо и то работи напълно добре с мен. (Нямам сценарий в приложението си, но не мисля, че ще повлияе на нещо.)

UILabel *bioLabel = [[UILabel alloc] init];
CGRect labelFrame = CGRectMake(0, 100, 320, 500);
bioLabel.frame = labelFrame;
NSString *bio =@"YOUR_TEXT_HERE";
bioLabel.text = description;
[bioLabel setNumberOfLines:0];
[bioLabel sizeToFit];
[self.view addSubview:bioLabel];
person Jim    schedule 07.02.2013

И аз имам проблем, моят код е следният:

    TeacherTagBtn *tagBtn = [[TeacherTagBtn alloc] init];
    [tagBtn setTitle:tagModel.values forState:UIControlStateNormal];

    [tagBtn.titleLabel sizeToFit];

TeacherTagBtn подклас на UIbutton, който познавате! тогава искам да получа ширината на етикета по следния начин:

tempBtn.titleLabel.frame.size.width

Накрая се провалих. ширината е 0. така че така:

    TeacherTagBtn *tagBtn = [[TeacherTagBtn alloc] initWithFrame:CGRectMake(0, 0, 100, 16)];
    [tagBtn setTitle:tagModel.values forState:UIControlStateNormal];
    [tagBtn.titleLabel sizeToFit];

добавете само рамка, работи перфектно!

person Mango    schedule 27.10.2015