AutoLayout связывает два UILabels с одинаковым размером шрифта

У меня есть два UILabels рядом друг с другом в ряд с левой и правой настройками, чтобы он выглядел ниже.

|-Some text left adjusted----------some other text right adjusted-| 

Обе метки имеют настройкиFontSizeToFitWidth = YES и связаны друг с другом со следующим ограничением

 [NSLayoutConstraint constraintWithItem:_rightLabel attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:_leftLabel attribute:NSLayoutAttributeRight multiplier:1 constant:10] 

Чтобы они занимали столько места, сколько могут, и если места для исходного размера шрифта недостаточно, он будет уменьшен благодаря настройкеFontSizeToFitWidth, чтобы текст не был усечен.

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

3 Solutions collect form web for “AutoLayout связывает два UILabels с одинаковым размером шрифта”

Из документации adjustsFontSizeToWidth на adjustsFontSizeToWidth :

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

Я полагаю, что обновленный шрифт вычисляется во время рисования, а свойство font читается, а не записывается. Поэтому, я считаю, что предложение Эндрю использовать KVO font свойства font не будет работать.

Следовательно, для достижения нужного результата вам необходимо вычислить скорректированный размер шрифта.

Как отмечает Джексон в комментариях, этот очень удобный метод NSString для получения фактического шрифта устарел в iOS 7. Технически вы все равно можете использовать его до тех пор, пока он не будет удален.

Другой альтернативой является циклическое масштабирование шрифтов до тех пор, пока вы не найдете тот, который будет соответствовать обеим меткам. Я смог заставить его работать нормально; вот пример проекта, который показывает, как я это сделал .

Кроме того, вот код, если ссылка перестает работать:

 - (void)viewDidLoad { [super viewDidLoad]; NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:_rightLabel attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:_leftLabel attribute:NSLayoutAttributeRight multiplier:1 constant:10]; [self.view addConstraint:constraint]; } - (IBAction)makeRightLabelLongerPressed:(id)sender { self.rightLabel.text = @"some much longer right label text"; } - (IBAction)adjustLabelSizes:(id)sender { NSLog(@"Attempting to adjust label sizes…"); CGFloat minimumScaleFactor = fmaxf(self.rightLabel.minimumScaleFactor, self.leftLabel.minimumScaleFactor);; UIFont * startingFont = self.rightLabel.font; for (double currentScaleFactor = 1.0; currentScaleFactor > minimumScaleFactor; currentScaleFactor -= 0.05) { UIFont *font = [startingFont fontWithSize:startingFont.pointSize * currentScaleFactor]; NSLog(@" Attempting font with scale %f (size = %f)…", currentScaleFactor, font.pointSize); BOOL leftLabelWorks = [self wouldThisFont:font workForThisLabel:self.leftLabel]; BOOL rightLabelWorks = [self wouldThisFont:font workForThisLabel:self.rightLabel]; if (leftLabelWorks && rightLabelWorks) { NSLog(@" It fits!"); self.leftLabel.font = font; self.rightLabel.font = font; return; } else { NSLog(@" It didn't fit. :-("); } } NSLog(@" It won't fit without violating the minimum scale (%f), so set both to minimum. Some text may get truncated.", minimumScaleFactor); UIFont *minimumFont = [self.rightLabel.font fontWithSize:self.rightLabel.font.pointSize * self.rightLabel.minimumScaleFactor]; self.rightLabel.font = minimumFont; self.leftLabel.font = minimumFont; } - (BOOL) wouldThisFont:(UIFont *)testFont workForThisLabel:(UILabel *)testLabel { NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:testFont, NSFontAttributeName, nil]; NSAttributedString *as = [[NSAttributedString alloc] initWithString:testLabel.text attributes:attributes]; CGRect bounds = [as boundingRectWithSize:CGSizeMake(CGRectGetWidth(testLabel.frame), CGFLOAT_MAX) options:(NSStringDrawingUsesLineFragmentOrigin) context:nil]; BOOL itWorks = [self doesThisSize:bounds.size fitInThisSize:testLabel.bounds.size]; return itWorks; } - (BOOL)doesThisSize:(CGSize)aa fitInThisSize:(CGSize)bb { if ( aa.width > bb.width ) return NO; if ( aa.height > bb.height ) return NO; return YES; } 

Этот подход может быть тривиально реорганизован в метод категории, который заменяет устаревший метод, связанный с Джексоном.

Я нашел лучшее решение. Просто добавьте в ur текстовые пространства от начала до конца до uilabel, у которых меньше длины текста. И шрифт будет таким же.

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

В вашем методе -viewDidLoad :

 // Add self as an observer of _rightLabel's font property [_rightLabel addObserver:self forKeyPath:@"font" options:NSKeyValueObservingOptionNew context:NULL]; 

В той же самой реализации контроллера (self в приведенном выше контексте фрагмента кода):

 // Observe changes to the font property of _rightLabel - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (object == _rightLabel && [keyPath isEqualToString:@"font"]) { // Set _leftLabel's font property to be the new value set on _rightLabel _leftLabel.font = change[NSKeyValueChangeNewKey]; } } 
  • Настройка текста UILabel на жирный шрифт
  • UILabel с двумя цветными текстами
  • Обновление ярлыка с помощью кнопки с другого вида
  • Сохраняйте UILabel с центром в UIView, когда изменяется длина символов. iOS, цель C
  • Разрывы строк и количество строк в Swift Label (программно)
  • Как создать UILabel или UITextView с жирным и нормальным текстом?
  • Как добавить точки в UILabel, если текст не подходит для рамки
  • Добавить динамический текст GPUImage в отфильтрованное видео
  • Получите текущий размер шрифта от автоматического сокращения UILabel
  • TTTAttributedLabel не отображает последнюю строку при использовании символов Emoji
  • iOS 7/8 UITableView Cell: два UILabels с динамической высотой с автоматической компоновкой для переменной высоты строки
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.