2017-01-17 4 views
0

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

Моя цель состоит в том, чтобы размер текста был одинаковым для всех из них, так что после того, как каждая метка определит, насколько мала его текст, чтобы соответствовать, все они изменяют размер текста до размера самого маленького размера шрифта среди UILabels. Это самый большой размер шрифта, который достаточно мал для соответствия текста каждого ярлыка.

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

+0

Не могли бы вы пройти через subviews - проверить только UILabels - вытащить размер шрифта - а затем зациклиться во второй раз, установив каждую метку на необходимый размер шрифта? – dfd

+0

Возможно, вам придется вычислять вещи вручную. Я только что настроил тест моего предложения, и кажется, что размер шрифта, регулируемый по размеру, не отражается в значении UILabel.font.pointSize. Все они вернулись как 17.: -/ – dfd

+0

@dfd Я думаю, что правильно, размер шрифта, показанный после сокращения, не имеет отношения к размеру шрифта, хранящемуся в шрифте ярлыка (за исключением того, что он не больше). Вы знаете, как вычислить конечный размер, прежде чем ячейки выкладывают свой текст? Это решит мою проблему. – BallpointBen

ответ

0

Вам нужно будет перебирать этикетки, чтобы найти необходимый минимальный размер. Проверьте этот код

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 10)) 
    let textArray = ["asdasdas","asdsd","asdas"] 
    let size : CGFloat = 14 
    var minimumSize = size 
    for string in textArray{ 
     var i : CGFloat = 0 
     while size-i>0 { 
      let font = UIFont.systemFont(ofSize: size-i) 
      let preferredSize = label.preferredLabelSize(maximumFrameBounds: view.frame, font: font, text: string) 
      if label.frame.size.width>=preferredSize.width{ 
       minimumSize = min(size-i, minimumSize) 
       print(minimumSize) 
       break 
      } 
      i += 1 
     } 
     print(minimumSize) 
    } 

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

+0

Спасибо. Проблема с автоматической компоновкой заключается в том, что если метки имеют одинаковый размер (что они в моем случае, но это не важно), но содержат текст разной длины (что важно), то каждый из них будет изменять размер текста в соответствии с сами по себе, что означает, что более длинные строки получают меньший размер шрифта. Я хочу, чтобы строки всех меток имели одинаковый (самый маленький) размер шрифта. По сути, я хочу ограничить размеры шрифтов ярлыков равными, но автоматический макет не позволяет такое. – BallpointBen

+0

Auto-layout не изменяет размер текста, если вы не укажете высоту/ширину и сделайте метку многострочной, она изменит размер фрейма метки. Но да, я понимаю, что вы хотите, чтобы все ярлыки имели одинаковый размер :) – ebby94

+0

Однако, я думаю, ваш ответ должен работать. Только один вопрос: совместим ли он с автоматической компоновкой? Должен ли я установить setNeedsDisplay() при изменении поворота? Во всяком случае, я проверю это в ближайшее время. Благодарю. – BallpointBen

Смежные вопросы