У меня есть размер, UILabel
который может быть разной длины в зависимости от того, работает ли мое приложение в портретном или ландшафтном режиме на iPhone или iPad. Когда текст слишком длинный для отображения в одной строке и обрезается, я хочу, чтобы пользователь мог нажать его и получить всплывающее окно с полным текстом.
Как я могу проверить, UILabel
не усекает ли текст? Это вообще возможно? Прямо сейчас я просто проверяю разные длины в зависимости от того, в каком режиме я нахожусь, но он не работает очень хорошо.
UILabel
API.Ответы:
Вы можете рассчитать ширину строки и посмотреть, больше ли она, чем
label.bounds.size.width
NSString UIKit Additions имеет несколько методов для вычисления размера строки с определенным шрифтом. Однако, если у вас есть минимальный размер шрифта для вашей метки, который позволяет системе уменьшить текст до этого размера. Вы можете использовать sizeWithFont: minFontSize: actualFontSize: forWidth: lineBreakMode: в этом случае.
источник
numberOfLines
возвращает максимальное количество строк, используемых для отображения текста, как указано вUILabel
справочнике по классу: developer.apple.com/library/ios/documentation/UIKit/Reference/…Swift (как расширение) - работает для многострочного uilabel:
swift4: (
attributes
параметрыboundingRect
немного изменены)swift3:
swift2:
источник
РЕДАКТИРОВАТЬ: Я только что увидел, что за мой ответ проголосовали, но приведенный мной фрагмент кода устарел.
Теперь лучший способ сделать это (ARC):
Обратите внимание, что рассчитанный размер не является целым числом. Поэтому, если вы сделаете что-то вроде
int height = rect.size.height
, вы потеряете некоторую точность с плавающей запятой и можете получить неверные результаты.Старый ответ (устарел):
Если ваша метка многострочная, вы можете использовать этот код:
источник
вы можете создать категорию с помощью UILabel
источник
textRectForBounds:limitedToNumberOfLines:
«Вы не должны вызывать этот метод напрямую» ...setNeedsLayout()
layoutIfNeeded()
в начале метода.Используйте эту категорию, чтобы узнать, обрезана ли метка в iOS 7 и выше.
источник
Swift 3
Вы можете подсчитать количество строк после назначения строки и сравнить с максимальным количеством строк метки.
источник
Чтобы добавить к ответу iDev , вы должны использовать
intrinsicContentSize
вместоframe
, чтобы он работал для Autolayoutисточник
Это оно. Это работает
attributedText
, прежде чем вернуться к простомуtext
, что имеет большой смысл для нас, людей, которые имеют дело с несколькими семействами шрифтов, размерами и даже NSTextAttachments!Прекрасно работает с автопложением, но, очевидно, ограничения должны быть определены и установлены до проверки
isTruncated
, иначе сама метка даже не узнает, как себя выложить, поэтому она даже не узнает, усечена ли она.Невозможно подойти к этой проблеме с помощью простого
NSString
иsizeThatFits
. Не знаю, как люди получали такие положительные результаты. Кстати, как упоминалось много раз, использованиеsizeThatFits
не идеально, потому что оно учитываетnumberOfLines
результирующий размер, который сводит на нет всю цель того, что мы пытаемся сделать, потомуisTruncated
что всегда будет возвращаться,false
независимо от того, усечено оно или нет.источник
Вот выбранный ответ в Swift 3 (как расширение). OP спрашивал о метках 1 строки. Многие из быстрых ответов, которые я здесь пробовал, относятся к многострочным меткам и не помечают правильно на однострочных метках.
источник
Это работает для iOS 8:
источник
Я написал категорию для работы с усечением UILabel. Работает на iOS 7 и новее. Надеюсь, поможет ! усечение хвоста uilabel
источник
Вы можете рассчитать ширину строки и посмотреть, больше ли она, чем ширина этикетки.
источник
Чтобы добавить к тому, что сделал @iDev , я изменил его,
self.frame.size.height
чтобы использовать,label.frame.size.height
но также не использовалNSStringDrawingUsesLineFontLeading
. После этих изменений я добился точного расчета того, когда произойдет усечение (по крайней мере, для моего случая).источник
У меня были проблемы с
boundingRect(with:options:attributes:context:)
использованием автоматического раскладки (для установки максимальной высоты) и текста с атрибутами сNSParagraph.lineSpacing
Интервал между строками был проигнорирован (даже при передаче в
attributes
кboundingRect
методу) так , чтобы этикетка может рассматриваться как не обрезано , когда это было.Решение, которое я нашел, - использовать
UIView.sizeThatFits
:источник
Поскольку во всех приведенных выше ответах используются устаревшие методы, я подумал, что это может быть полезно:
источник
Чтобы справиться с iOS 6 (да, некоторым из нас все же придется), вот еще одно дополнение к ответу @ iDev. Ключевой вывод заключается в том, что для iOS 6 перед вызовом sizeThatFits убедитесь, что numberOfLines вашего UILabel установлено в 0; в противном случае вы получите результат, в котором говорится, что «точки для рисования на уровне numberOfLines должны иметь высоту», необходимые для рисования текста метки.
источник
Обязательно вызовите любой из них в viewDidLayoutSubviews.
источник
SWIFT 5
Пример многострочного UILabel, который настроен на отображение только 3 строк.
Хотя пользователь может выбрать клавишу возврата, добавив дополнительную строку без увеличения «ширины текста», в этом случае что-то подобное также может быть полезно.
источник
Решение Swift 3
Я думаю, что лучшим решением является (1) создать
UILabel
с теми же свойствами, что и метка, которую вы проверяете на усечение, (2) вызвать.sizeToFit()
, (3) сравнить атрибуты фиктивной метки с вашей фактической меткой.Например, если вы хотите проверить, обрезается ли однострочная этикетка с разной шириной или нет, вы можете использовать это расширение:
... но опять же, вы можете легко изменить приведенный выше код в соответствии со своими потребностями. Допустим, ваша этикетка многострочная и имеет разную высоту. Тогда расширение будет выглядеть примерно так:
источник
Было бы легко установить атрибут заголовка для метки, установка этого значения будет отображать полную метку при наведении курсора.
вы можете рассчитать длину метки и ширину div (преобразовать в длину - jQuery / Javascript - как преобразовать значение пикселя (20 пикселей) в числовое значение (20) ).
установите jquery для установки заголовка, если длина больше ширины div.
источник