Текст UILabel не изменяется автоматически с помощью автоматической компоновки

Я пытаюсь реализовать ограниченный подкласс UITableViewCell, и все работает отлично, за исключением UILabel. Ограничения, которые я установил, определенно соблюдаются, но текст внутри метки не изменяет размер до меньшего размера шрифта при столкновении ограничений. Вместо этого высота UILabel усекается, а шрифт остается того же размера, что означает, что буквы обрезаются сверху и снизу.

Есть ли какой-то метод, который мне нужно вызвать, чтобы заставить его работать? Я бы подумал, что Auto Layout будет достаточно умным, чтобы автоматически изменять размер шрифта, поэтому я немного потерял, почему это происходит.

Соответствующий код:

self.label = [[UILabel alloc] initWithFrame:CGRectZero];
self.label.textColor = [UIColor whiteColor];
self.label.translatesAutoresizingMaskIntoConstraints = NO;
self.label.textAlignment = NSTextAlignmentCenter;
self.label.numberOfLines = 1;
[self.contentView addSubview:self.label];

NSLayoutConstraint *otherViewToLabelHorizontalConstraint =  // Make sure that the label is always to the right of the other view.
                    [NSLayoutConstraint constraintWithItem:self.label 
                                                 attribute:NSLayoutAttributeLeft 
                                                 relatedBy:NSLayoutRelationGreaterThanOrEqual
                                                    toItem:self.otherView 
                                                 attribute:NSLayoutAttributeRight 
                                                multiplier:1.0
                                                  constant:0.0];

NSLayoutConstraint *aTextFieldToLabelVerticalConstraint = 
                    [NSLayoutConstraint constraintWithItem:self.label 
                                                 attribute:NSLayoutAttributeTop 
                                                 relatedBy:NSLayoutRelationGreaterThanOrEqual
                                                    toItem:self.aTextField 
                                                 attribute:NSLayoutAttributeBottom 
                                                multiplier:1.0
                                                  constant:0.0];

В принципе, эти ограничения предназначены для принудительного использования ячейки, где otherView находится слева, aTextField находится справа от otherView на том же уровне y, а метка ниже aTextField и справа от нижней части otherView.

Как обычно, спасибо за любую помощь в этом.

Ответ 1

Вам нужно

myLabel.adjustsFontSizeToFitWidth = YES;
myLabel.minimumScaleFactor = .5f;

Затем размер шрифта метки будет автоматически настроен.

Ответ 2

Наряду с настройкой adjustsFontSizeToFitWidth и minimumScaleFactor вам также необходимо настроить сжатие содержимого метки на низкий приоритет. Просмотрите раздел "Сопротивление сжатию и содержание" этого objc.io эссе. В принципе, если ваша метка имеет более низкий приоритет устойчивости к сжатию, чем конечное ограничение, метка должна быть изменена:

[myLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow
                                 forAxis:UILayoutConstraintAxisHorizontal];

Ответ 3

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

   NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0f constant:width];

И убедитесь, что приоритет для этого ограничения установлен в UILayoutPriorityRequired.

[constraint setPriority:UILayoutPriorityRequired];

Текст изменялся при прикреплении метки к супервизору, но не к текстовому полю, поэтому я решил, что должна быть проблема с внутренними размерами элементов, участвующих в расчете макета для окончательной ширины метки.