У меня есть метка, которую я создаю и отображаю программно. Это может быть 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 с высотой такой же, как высота строки атрибутивной строки.