Получение UILabel для создания многоточия вместо уменьшения шрифта

#iphone #objective-c #xcode #uilabel

#iPhone #objective-c #xcode #uilabel

Вопрос:

Когда я динамически изменяю текст UILabel, я бы предпочел получить многоточие (точка, точка, точка), а затем автоматически изменять размер текста. Как это сделать?

Другими словами, если у меня есть UILabel со словом Cat с размером шрифта 14, а затем я меняю слово на Hippopotamus шрифт, он сжимается, чтобы вместить все слово. Я бы предпочел, чтобы слово автоматически усекалось, за которым следует многоточие.

Я предполагаю, что есть параметр, который можно изменить в моем объекте UILabel. Я бы предпочел не делать это программно.

Ответ №1:

Задайте следующие свойства:

Цель С

 label.adjustsFontSizeToFitWidth = NO;
label.lineBreakMode = NSLineBreakByTruncatingTail;
  

Swift

 label.adjustsFontSizeToFitWidth = false
label.lineBreakMode = .byTruncatingTail
  

Вы также можете установить эти свойства в Interface builder.

Комментарии:

1. UILineBreakModeTailTruncation помечено как устаревшее, документы рекомендуют использовать NSLineBreakByTruncatingTail . Что делает то же самое.

2. Я также считаю, что по умолчанию для UILabels должно быть установлено значение adjustsFontSizeToFitWidth равным NO

3. Что делать, если у вас есть две метки рядом и вы хотите, чтобы одну можно было обрезать многоточием, а другую нельзя ни регулировать размер шрифта, ни усекать (предположим, что для текста достаточно места). Их фреймы настраиваются с использованием ограничений. Существует ли ограничение, которое заставит размер быть по крайней мере таким же большим, как размер содержимого, который должен быть, чтобы предотвратить многоточие или усечение?

Ответ №2:

У меня возникла проблема с созданием многоточия после того, как я создал UILabel и мне нужно было использовать UILabel.attributedText вместо UILabel.text . В стиле абзаца есть режим разрыва строки, который перезаписывает UILabel.lineBreakMode при использовании приписываемого текста. Вам нужно будет установить значение lineBreakMode to .byTruncatingTail в стиле абзаца приписываемой строки, если вы хотите добиться многоточия.

например

     let text = "example long string that should be truncated"
    let attributedText = NSMutableAttributedString(
        string: text, 
        attributes: [.backgroundColor : UIColor.blue.cgColor]
    )
    let range = NSRange(location: 0, length: attributedText.length)
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineBreakMode = .byTruncatingTail
    attributedText.addAttribute(.paragraphStyle, value: paragraphStyle, range: range)
    uiLabel.attributedText = attributedText
  

Комментарии:

1. На какую текстовую строку вы ссылаетесь? Это должно быть «пример long strong»?

2. Извините, я вижу, как это сбивало с толку, просто исправил пример и подтвердил, что он работает на игровой площадке.

Ответ №3:

Быстрое решение:

 label.lineBreakMode = .ByTruncatingTail
  

Swift 3:

 label.lineBreakMode = .byTruncatingTail
  

Комментарии:

1. разве вы не можете просто сделать label.lineBreakMode = .ByTruncatingTail ?

2. Похоже на это — да 🙂

Ответ №4:

В построителе интерфейса это путь:

Настройка разрыва строки в построителе интерфейса