Размер текста 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.

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


person J Kagney    schedule 17.06.2013    source источник
comment
Вы получаете исключение или другое сообщение журнала в консоли при добавлении этих ограничений?   -  person larsacus    schedule 19.06.2013
comment
Нет, в конце концов я избавился от частей, которые использовали это ограничение.   -  person J Kagney    schedule 19.06.2013


Ответы (3)


Тебе нужно

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

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

person sunkehappy    schedule 18.06.2013
comment
Спасибо за ответ, но после внедрения этого кода он все еще остается обрезанным сверху и снизу. У меня шрифт размером 18.0f. Я протестировал шрифт, и минимальный размер шрифта - 13.0f, поэтому я не понимаю, почему он не будет автоматически уменьшать его до тех пор, пока не будет достигнут множитель 0.5f. - person J Kagney; 18.06.2013

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

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

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

[constraint setPriority:UILayoutPriorityRequired];

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

person Alejandro Benito-Santos    schedule 09.04.2014
comment
что такое size в constant:size? - person jowie; 17.04.2014
comment
Это фактическая ширина представления, которую вы хотите ограничить. Я изменил его на ширину, как и должно быть. Спасибо, что заметили ошибку - person Alejandro Benito-Santos; 17.04.2014

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

[myLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow
                                 forAxis:UILayoutConstraintAxisHorizontal];
person Eric Allam    schedule 26.03.2014
comment
Если этикетка усекается, вы хотите, чтобы сопротивление сжатию было высоким, а не низким. Не так ли? - person smileBot; 18.04.2015