2016-03-25 5 views
0

У меня есть метка, которую я создаю и отображаю программно. Это может быть 1 или более строк. Я хочу, чтобы метка была усечена в конце, если она слишком длинная. Когда метка длиной> 1 строка, следующий код работает нормально. Создайте пустой проект и отбросьте его в viewDidLoad, чтобы играть дома. Любой проект iOS или tvOS должен делать.UILabel sizeThatFits слишком широкий для 1-строчной метки

UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero]; 
label.numberOfLines = 2; 
label.lineBreakMode = NSLineBreakByTruncatingTail; 
label.backgroundColor = [UIColor blueColor]; 
[self.view addSubview:label]; 

NSDictionary *attributes = @{NSFontAttributeName:[UIFont systemFontOfSize:26.0]}; 

label.attributedText = [[NSAttributedString alloc] initWithString:@"The rain in Spain falls mainly on the plain." attributes:attributes]; 

CGSize maxLabelSize = CGSizeMake(200, CGFLOAT_MAX); 
CGSize requiredSize = [label sizeThatFits:maxLabelSize]; 
NSLog(@"requiredSize: %@", NSStringFromCGSize(requiredSize)); 
label.frame = CGRectMake(50.0, 50.0, requiredSize.width, requiredSize.height); 

Однако, если я изменю numberOfLines к 1, то sizeThatFits возвращается размером с шириной достаточно широкими, чтобы соответствовать всей строке, даже если это больше, чем ширина maxLabelSize.

я могу обойти эту проблему, проверив, чтобы увидеть, если requiredSize.width больше maxLabelSize.width, и регулируя соответствующим образом, но я хотел бы знать, почему sizeThatFits ведет себя по-разному с меткой 1-линии, чем с меткой многострочным. Я ожидал бы, что размер не более 200 с высотой такой же, как высота строки атрибутивной строки.

ответ

2

Не знаю, почему sizeThatFits не работает, но другой метод textRectForBounds:limitedToNumberOfLines: делает трюк. Что-то вроде

label.numberOfLines = 0; 
CGSize requiredSize = [label textRectForBounds:CGRectMake(0, 0, 200, CGFLOAT_MAX) limitedToNumberOfLines:1].size; 
0

UILabel * commlbl;

commlbl=[[UILabel alloc]initWithFrame:CGRectMake(10, commlbl1.bounds.size.height+50, commscroll.bounds.size.width-25, commscroll.bounds.size.height+70)]; 
[commlbl setFont:[UIFont fontWithName:@"OpenSans-Regular" size:16]]; 
[commlbl setTextColor:[UIColor whiteColor]]; 
[commlbl setTextAlignment:NSTextAlignmentCenter]; 
commlbl.lineBreakMode = NSLineBreakByWordWrapping; 
commlbl.numberOfLines = 0; 
commlbl.text = [USER_DFT GetUserDefault:@"msgString"]; 
CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX); 

CGSize expectedLabelSize = [commlbl.text sizeWithFont:commlbl.font constrainedToSize:maximumLabelSize lineBreakMode:commlbl.lineBreakMode]; 
    //adjust the label the the new height. 
CGRect newFrame = commlbl.frame; 
newFrame.size.height = expectedLabelSize.height; 
commlbl.frame = newFrame; 
Смежные вопросы