IOS Добавить левый отступ в UILabel
Мне нужно создать UILabel
с фоновым цветом, и я бы хотел добавить несколько оставшихся дополнений, но каждое найденное мной решение кажется неприятным взломом.
Каков "стандартный" способ достичь этого с iOS 5 впереди?
ИЗМЕНИТЬ
Снимок экрана, иллюстрирующий мой сценарий.
![enter image description here]()
Ответы
Ответ 1
Полный список доступных решений см. в этом ответе: поля текста UILabel
Попробуйте подклассифицировать UILabel, как @Tommy Herbert предлагает в ответ на [этот вопрос] [1]. Скопировано и вставлено для вашего удобства:
Я решил это путем подкласса UILabel и переопределения drawTextInRect: вот так:
- (void)drawTextInRect:(CGRect)rect {
UIEdgeInsets insets = {0, 5, 0, 5};
[super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}
Ответ 2
добавьте символ пробела также в строку. что бедный человек дополняет:)
ИЛИ
Я бы пошел с пользовательским фоном, но если вы этого не хотите, пространство - это единственные другие удобные опции, которые я вижу...
ИЛИ напишите пользовательскую метку. сделать текст через coretext
Ответ 3
Я знаю, что это старо, но для потомков.
Самая важная часть заключается в том, что вы должны переопределять как intrinsicContentSize(), так и drawTextInRect() для учета AutoLayout
var contentInset: UIEdgeInsets = .zero {
didSet {
setNeedsDisplay()
}
}
override public var intrinsicContentSize: CGSize {
let size = super.intrinsicContentSize
return CGSize(width: size.width + contentInset.left + contentInset.right, height: size.height + contentInset.top + contentInset.bottom)
}
override public func drawText(in rect: CGRect) {
super.drawText(in: UIEdgeInsetsInsetRect(rect, contentInset))
}
Ответ 4
#define PADDING 5
@interface MyLabel : UILabel
@end
@implementation MyLabel
- (void)drawTextInRect:(CGRect)rect {
return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, UIEdgeInsetsMake(0, PADDING, 0, PADDING))];
}
- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines
{
return CGRectInset([self.attributedText boundingRectWithSize:CGSizeMake(999, 999)
options:NSStringDrawingUsesLineFragmentOrigin
context:nil], -PADDING, 0);
}
@end
Ответ 5
UIView* bg = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.frame.size.width, 70)];
bg.backgroundColor = [UIColor blackColor];
UILabel* yourLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, y, yourWidth, yourHeight)];
[bg addSubview:yourLabel];
[self addSubview:bg];
Ответ 6
Иногда удобно использовать частичные пространства UNICODE для достижения выравнивания при прототипировании. Это может быть полезно в прототипировании, доказательстве концепции или просто для отсрочки реализации графических алгоритмов.
Если вы используете удобные пространства UNICODE, имейте в виду, что по крайней мере одно из пространств UNICODE имеет размер, основанный на шрифте, на котором он отображается, в частности фактический сам пробел (U + 0020, ASCII 32)
Если вы используете системный шрифт по умолчанию для iOS в UILabel, характеристики системного шрифта по умолчанию могут измениться в следующей версии iOS и внезапно ввести нежелательное смещение, изменив точное расстояние вашего приложения. Это может и происходит, например, шрифт "Сан-Франциско" заменил предыдущий системный шрифт iOS в выпуске iOS.
UNICODE легко указать в Swift, например:
let six_per_em_space = "\u{2006}"
В качестве альтернативы вырезать/вставить пространство с HTML-страницы непосредственно в текстовое поле UILabel в Interface Builder.
Примечание. Прикрепленный рисунок - это скриншот, а не HTML, поэтому перейдите на связанную страницу, если вы хотите вырезать/вставить пробел.
![UNICODE spaces]()
Ответ 7
У меня было несколько проблем с ответами здесь, например, когда вы добавили в заполнение, ширина содержимого переполняла ящик и что мне нужен угол в радиусе. Я решил это, используя следующий подкласс UILabel:
#import "MyLabel.h"
#define PADDING 8.0
#define CORNER_RADIUS 4.0
@implementation MyLabel
- (void)drawRect:(CGRect)rect {
self.layer.masksToBounds = YES;
self.layer.cornerRadius = CORNER_RADIUS;
UIEdgeInsets insets = {0, PADDING, 0, PADDING};
return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}
- (CGSize) intrinsicContentSize {
CGSize intrinsicSuperViewContentSize = [super intrinsicContentSize] ;
intrinsicSuperViewContentSize.width += PADDING * 2 ;
return intrinsicSuperViewContentSize ;
}
@end
Надеюсь, что это поможет кому-то! Обратите внимание: если вы хотите заполнить сверху и снизу, вам нужно будет изменить следующие строки:
UIEdgeInsets insets = {0, PADDING, 0, PADDING};
Для этого:
UIEdgeInsets insets = {PADDING, PADDING, PADDING, PADDING};
И добавьте эту строку под аналогичную для ширины:
intrinsicSuperViewContentSize.height += PADDING * 2 ;
Ответ 8
Одна вещь, которую я сделал, чтобы преодолеть эту проблему, заключалась в использовании UIButton вместо UILabel. Затем в инспекторе атрибутов построителя интерфейсов я использовал Edge для Title в качестве дополнения.
Если вы не прикрепляете кнопку к действию, при нажатии она не будет выбрана, но она все равно покажет выделение.
Вы также можете сделать это программно со следующим кодом:
UIButton *mButton = [[UIButton alloc] init];
[mButton setTitleEdgeInsets:UIEdgeInsetsMake(top, left, bottom, right)];
[mButton setTitle:@"Title" forState:UIControlStateNormal];
[self.view addSubView:mButton];
Этот подход дает тот же результат, но иногда он не работал по какой-то причине, что я не исследовал, поскольку, по возможности, я использую Interface Builder.
Это все еще обходное решение, но оно работает очень хорошо, если подсветка вас не беспокоит. Надеюсь, что это полезно
Ответ 9
подклассификация UILabel и переопределение drawTextInRect: например:
- (void)drawTextInRect:(CGRect)rect
{
UIEdgeInsets insets = {0, 10, 0, 0};
return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}
Ответ 10
Если вы хотите добавить дополнение к UILabel
, но не хотите подкласса, вы можете поместить свою метку в UIView
и дать paddings с автозапуском, например:
![Заполнение с помощью UIView и автозапуск]()
Результат:
![Результат]()
Ответ 11
Swift 5
Создайте файл под классом и присвойте ему метку в качестве пользовательского имени класса через раскадровку. Это.
class PaddingLabel: UILabel {
override func drawText(in rect: CGRect) {
let insets = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)//CGRect.inset(by:)
super.drawText(in: rect.inset(by: insets))
}
}
Ответ 12
Если вам требуется более конкретное выравнивание текста, чем добавление пробелов слева от текста, вы всегда можете добавить второй пустой ярлык, сколько именно отступа, которое вам нужно.
У меня есть кнопки с текстом, выровненным слева с отступом 10px и нуждающимся в ярлыке ниже, чтобы смотреть в линию.
Он дал метке текст и выравнивание слева и положил ее на x = 10, а затем сделал небольшую вторую метку того же цвета фона с шириной = 10 и выстроил ее рядом с реальной меткой.
Минимальный код и выглядит хорошо.
Просто заставляет AutoLayout немного больше хлопот, чтобы все работало.