Ответ 1
Вам нужно
myLabel.adjustsFontSizeToFitWidth = YES;
myLabel.minimumScaleFactor = .5f;
Затем размер шрифта метки будет автоматически настроен.
Я пытаюсь реализовать ограниченный подкласс 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
.
Как обычно, спасибо за любую помощь в этом.
Вам нужно
myLabel.adjustsFontSizeToFitWidth = YES;
myLabel.minimumScaleFactor = .5f;
Затем размер шрифта метки будет автоматически настроен.
Наряду с настройкой adjustsFontSizeToFitWidth
и minimumScaleFactor
вам также необходимо настроить сжатие содержимого метки на низкий приоритет. Просмотрите раздел "Сопротивление сжатию и содержание" этого objc.io эссе. В принципе, если ваша метка имеет более низкий приоритет устойчивости к сжатию, чем конечное ограничение, метка должна быть изменена:
[myLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow
forAxis:UILayoutConstraintAxisHorizontal];
Я решил эту проблему, установив ограничение ширины в представление, к которому я привязывал метку.
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0f constant:width];
И убедитесь, что приоритет для этого ограничения установлен в UILayoutPriorityRequired.
[constraint setPriority:UILayoutPriorityRequired];
Текст изменялся при прикреплении метки к супервизору, но не к текстовому полю, поэтому я решил, что должна быть проблема с внутренними размерами элементов, участвующих в расчете макета для окончательной ширины метки.