У меня есть место, UILabel
где я хочу добавить место сверху и снизу. С минимальной высотой в ограничении я изменил это:
РЕДАКТИРОВАТЬ: Для этого я использовал:
override func drawTextInRect(rect: CGRect) {
var insets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0)
super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))
}
Но я должен найти другой метод, потому что, если я напишу больше двух строк, проблема будет та же:
Ответы:
Если вы хотите придерживаться UILabel без подклассов, Mundi предоставил вам четкое решение.
Если вы хотите избежать упаковки UILabel с UIView, вы можете использовать UITextView, чтобы разрешить использование UIEdgeInsets (заполнение) или подкласса UILabel для поддержки UIEdgeInsets.
Использование UITextView должно было бы обеспечить только вставки (OBJ-C):
Альтернативно, если вы подкласс UILabel , примером этого подхода будет переопределение метода drawTextInRect
(OBJ-C)
Вы могли бы дополнительно предоставить вашему новому подклассу UILabel переменные-вставки для TOP, LEFT, BOTTOM и RIGHT.
Пример кода может быть:
В .ч (OBJ-C)
Дюймы (OBJ-C)
РЕДАКТИРОВАНИЕ № 1:
Из того, что я видел, кажется, что вы должны переопределить intrinsicContentSize UILabel при создании его подкласса.
Поэтому вы должны переопределить intrinsicContentSize следующим образом:
И добавьте следующий метод для редактирования ваших вкладок, вместо того, чтобы редактировать их по отдельности:
Он обновит размер вашей UILabel, чтобы он соответствовал краям вставок и покрывал необходимость многострочной связи, на которую вы ссылались.
Редактировать № 2
После небольшого поиска я нашел этот Gist с IPInsetLabel. Если ни одно из этих решений не работает, вы можете попробовать его.
Редактировать № 3
Был похожий вопрос (дубликат) по этому вопросу.
Полный список доступных решений см. В следующем ответе: текстовое поле UILabel
источник
Я попробовал с ним на Swift 4.2 , надеюсь, это сработает для вас!
Или вы можете использовать CocoaPods здесь https://github.com/levantAJ/PaddingLabel
pod 'PaddingLabel', '1.2'
источник
min
Swift 3
источник
Вы можете сделать это правильно из IB:
источник
SWIFT 4
Простое в использовании решение, доступное для всех детей UILabel в проекте.
Пример:
UILabel Extension
источник
Просто используйте
UIView
как суперпредставление и определите фиксированное поле для метки с автоматическим макетом.источник
drawTextInRect
работает только для 1 строки,intrinsicContentSize
не работает с горизонтальным заполнением. Оберните UILabel в UIView - это хороший путьПросто используйте UIButton, он уже встроен. Отключите все дополнительные функции кнопок, и у вас есть метка, на которой можно установить ребра.
источник
isUserInteractionEnabled = false
удобна для ее отключения.Без раскадровки:
Использование:
Результат:
источник
Дополнение
UILabel
, полное решение. Обновлено на 2020.Оказывается, есть три вещи, которые необходимо сделать.
1. Должен вызывать textRect # forBounds с новым меньшим размером
2. Необходимо переопределить drawText с новым меньшим размером
3. Если ячейка динамического размера, необходимо настроить intrinsicContentSize
В приведенном ниже типичном примере текстовая единица находится в виде таблицы, в виде стека или в аналогичной конструкции, что дает ей фиксированную ширину . В примере мы хотим заполнить 60,20,20,24.
Таким образом, мы берем «существующий» intrinsicContentSize и фактически добавляем 80 к высоте .
Повторить ...
Я нахожу этот процесс запутанным, но именно так он и работает. Для меня Apple должна выставить вызов под названием что-то вроде «предварительного расчета высоты».
Во-вторых, мы должны использовать вызов textRect # forBounds с нашим новым меньшим размером .
Поэтому в textRect # forBounds мы сначала уменьшаем размер, а затем вызываем super.
Предупреждение! Вы должны позвонить супер после , а не раньше!
Если вы тщательно исследуете все попытки и обсуждения на этой странице, это точно проблема. Обратите внимание, что некоторые решения «кажутся почти работающими», но затем кто-то сообщит, что в определенных ситуациях это не сработает. Это действительно точная причина - сбивающий с толку вы должны «позвонить супер потом», а не раньше.
Таким образом, если вы называете super это «в неправильном порядке», это обычно работает, но не для определенных конкретных длин текста .
Вот точный визуальный пример «неправильно сначала делать супер»:
Обратите внимание, что поля 60,20,20,24 верны, НО вычисление размера на самом деле неверно, потому что это было сделано с помощью шаблона «super first» в textRect # forBounds.
Исправлена:
Обратите внимание, что только теперь движок textRect # forBounds знает, как правильно выполнять вычисления :
В заключение!
Опять же, в этом примере UILabel используется в типичной ситуации, когда ширина фиксирована. Таким образом, в intrinsicContentSize мы должны «добавить» необходимую нам дополнительную высоту. (Вам не нужно каким-либо образом "добавлять" ширину, это было бы бессмысленно, поскольку она исправлена.)
Затем в textRect # forBounds вы получаете «предложенные до сих пор» границы с помощью autolayout, вычитаете свои поля и только потом снова вызываете механизм textRect # forBounds, то есть в super, который даст вам результат.
Наконец, просто в drawText вы, конечно, рисуете в той же самой маленькой коробке.
Уф!
Снова. Обратите внимание, что ответы на этот и другие QA, которые являются «почти» правильными, переносят проблему на первом изображении выше - «супер находится в неправильном месте» . Вы должны принудительно увеличить размер в intrinsicContentSize, а затем в textRect # forBounds вы должны сначала уменьшить границы первого предложения, а затем вызвать super.
Резюме: вы должны "вызвать супер последний " в textRect # forBounds
Это секрет.
Обратите внимание, что вам не нужно и не нужно дополнительно вызывать invalidate, sizeThatFits, needsLayout или любой другой принудительный вызов. Правильное решение должно работать должным образом в обычном цикле рисования с автоматическим размещением.
Наконечник:
Если вы работаете с моноширинными шрифтами, вот отличный совет: https://stackoverflow.com/a/59813420/294884
источник
Свифт 4+
использование:
источник
Код Swift 3 с примером реализации
Не забудьте добавить имя класса UIMarginLabel в объект метки раскадровки. Удачного кодирования!
источник
Согласно Swift 4.2 (Xcode 10 beta 6) «UIEdgeInsetsInsetRect» считается устаревшим. Я также объявил класс публичным, чтобы сделать его более полезным.
источник
sizeToFit()
должно быть общедоступным как: «Метод переопределяющего экземпляра должен быть таким же доступным, как и его включающий тип»Я немного отредактировал принятый ответ. Существует проблема, когда
leftInset
иrightInset
увеличивается, часть текста исчезнет, b / c ширина метки будет сужена, но высота не увеличивается, как показано на рисунке:Для решения этой проблемы вам необходимо пересчитать высоту текста следующим образом:
и результат:
Я надеюсь помочь некоторым людям в той же ситуации, что и я.
источник
override func drawTextInRect(rect: CGRect)
становитсяoverride func drawText(in rect: CGRect)
иoverride func intrinsicContentSize() -> CGSize
становитсяoverride var intrinsicContentSize : CGSize
Наслаждайся!override var intrinsicContentSize: CGSize { // .. return intrinsicSuperViewContentSize }
Просто используйте autolayout:
Готово.
источник
Другой вариант без подклассов будет:
text
sizeToFit()
затем немного увеличьте высоту метки для имитации заполнения
источник
label.frame = CGRect( x: label.frame.origin.x - 10, y: label.frame.origin.y - 4, width: label.frame.width + 20,height: label.frame.height + 8)
Swift 3, решение iOS10:
источник
В Свифт 3
лучший и простой способ
источник
Подкласс UILabel. (File-New-File- CocoaTouchClass-make Подкласс UILabel).
На ViewController:
ИЛИ Свяжите пользовательский класс UILabel на раскадровке как класс Label.
источник
Как и другие ответы, но исправьте ошибку. Когда
label.width
управляется автоматическим макетом, иногда текст будет обрезан.источник
Легкая прокладка (Swift 3.0, Alvin George answer):
источник
Уточнение ответа Мунди.
т. е. встраивание метки в
UIView
и применение заполнения через Auto Layout. Пример:Обзор:
1) Создайте
UIView
(«панель») и установите его внешний вид.2) Создайте
UILabel
и добавьте его на панель.3) Добавить ограничения для обеспечения заполнения.
4) Добавьте панель в иерархию видов, затем расположите панель.
Подробности:
1) Создайте вид панели.
2) Создайте ярлык, добавьте его на панель в качестве подпредставления.
3) Добавьте ограничения между краями метки и панели. Это заставляет панель держаться на расстоянии от метки. то есть "набивка"
От редакции: делать все это вручную очень утомительно, многословно и подвержено ошибкам. Я предлагаю вам выбрать оболочку Auto Layout из github или написать ее самостоятельно
4) Добавьте панель в иерархию видов, а затем добавьте ограничения позиционирования. Например, обнимите правую часть tableViewCell, как в примере изображения.
Примечание: вам нужно только добавить позиционные ограничения, а не размерные ограничения: Auto Layout будет решать макет на основе как
intrinsicContentSize
метки, так и ограничений, добавленных ранее.источник
Используйте этот код, если вы столкнулись с проблемой обрезки текста при применении отступов.
источник
Аналогично другим ответам, но с классом func для динамической настройки заполнения:
источник
Одним из прагматических решений является добавление пустых ярлыков той же высоты и цвета, что и основной ярлык. Установите начальное / конечное пространство главной метки на ноль, выровняйте вертикальные центры и сделайте ширину желаемым полем.
источник
Если вы хотите добавить 2px отступы вокруг textRect, просто сделайте это:
источник
Если вы не хотите или вам не нужно использовать @IBInspectable / @IBDesignable UILabel в раскадровке (я думаю, что они все равно отображаются слишком медленно), тогда лучше использовать UIEdgeInsets вместо 4 разных CGFloats.
Пример кода для Swift 4.2:
источник
Objective-C
На основании ответа Тай Ле , который реализует функцию внутри IB Designable, вот версия Objective-C.
Поместите это в YourLabel.h
И это будет идти в YourLabel.m
Затем вы можете изменить вставки YourLabel непосредственно в Интерфейсном Разработчике после указания класса внутри XIB или раскадровки, значение по умолчанию для вставок равно нулю.
источник
Простой способ
источник
Легкая прокладка:
источник
Свифт 4+
источник