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 немного больше хлопот, чтобы все работало.