iOS добавить левое дополнение к UILabel


Мне нужно создать UILabel с цветом фона, и я хотел бы добавить некоторые левые отступы, но каждое решение, которое я нашел здесь, похоже на неприятный Хак.

какой "стандартный" способ добиться этого от iOS 5 впереди?

EDIT

скриншот, чтобы проиллюстрировать мой сценарий.-

11 64

11 ответов:

полный список доступных решений см. В следующем ответе:текстовое поле UILabel


попробуйте подкласс UILabel, как предлагает @Tommy Herbert в ответе на [этот вопрос][1]. Скопировано и вставлено для вашего удобства:

Я решил это путем подкласса UILabel и переопределения drawTextInRect: вот так:

- (void)drawTextInRect:(CGRect)rect {
    UIEdgeInsets insets = {0, 5, 0, 5};
    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}

добавить пробел тоже строку. это обивка бедняги:)

или

Я бы пошел с пользовательским фоновым представлением, но если вы этого не хотите, пространство-это единственные другие простые варианты, которые я вижу...

или написать пользовательскую метку. визуализация текста с помощью coretext

#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

Я знаю, что это старый, но для потомков..

наиболее важной частью является то, что вы должны переопределить как 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))
}
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];

иногда удобно использовать частичные пробелы UNICODE для достижения выравнивания при прототипировании. Это может быть удобно при прототипировании, доказательстве концепции или просто для отсрочки реализации графических алгоритмов.

Если вы используете пробелы Юникода для удобства, имейте в виду, что по крайней мере один из пробелов Юникода имеет размер, основанный на шрифте, из которого он отображается, в частности, сам фактический символ пробела (U+0020, ASCII 32)

Если вы используете систему iOS по умолчанию шрифт в UILabel характеристики системного шрифта по умолчанию могут измениться в последующем выпуске iOS и внезапно ввести нежелательное смещение, изменив точный интервал вашего приложения. Это может и происходит, например, шрифт "San Francisco" заменил предыдущий системный шрифт iOS в выпуске iOS.

Юникод легко указать в Swift, например:

let six_per_em_space = "\u{2006}"

кроме того, вырезать / вставить пробел из HTML-страницы непосредственно в текстовое поле UILabel в Конструктор Интерфейсов.

Примечание: прилагается рис скриншот,не HTML, так что посетите ссылке если вы хотите вырезать/вставить пробел.

UNICODE spaces

у меня было несколько проблем с ответами здесь, например, когда вы добавили в дополнение, ширина содержимого переполняла поле и мне нужен был какой-то радиус угла. Я решил это, используя следующий подкласс 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 ;

одна вещь, которую я сделал, чтобы преодолеть эту проблему, состояла в том, чтобы использовать UIButton вместо UILabel. Затем в Инспекторе атрибутов построителя интерфейса я использовал край для заголовка в качестве отступа.
Если вы не прикрепите кнопку к действию, при нажатии она не будет выбрана, но все равно будет отображаться подсветка.

вы также можете сделать это программно с помощью следующего кода:

UIButton *mButton = [[UIButton alloc] init];
[mButton setTitleEdgeInsets:UIEdgeInsetsMake(top, left, bottom, right)];
[mButton setTitle:@"Title" forState:UIControlStateNormal];
[self.view addSubView:mButton];

этот подход дает тот же результат, но иногда это делали не работает по какой-то причине, что я не исследовал, так как по возможности я использую Interface Builder.

Это все еще обходной путь, но он работает довольно хорошо, если подсветка не беспокоит вас. Надеюсь, что это полезно

подкласс UILabel и переопределение drawTextInRect: вот так:

 - (void)drawTextInRect:(CGRect)rect 
  {
      UIEdgeInsets insets = {0, 10, 0, 0};
      return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
  }

Если вы хотите добавить отступы для UILabel но не хотите, чтобы подкласс его вы можете поместить свою метку в UIView и дать прокладки с автозапуском, как:

Padding with UIView and autolayout

результат:

Result

Если вам нужно более конкретное выравнивание текста, чем то, что обеспечивает добавление пробелов слева от текста, вы всегда можете добавить вторую пустую метку точно, сколько отступа вам нужно.

У меня есть кнопки с выровненным текстом слева с отступом 10px и нужна метка ниже, чтобы посмотреть в строке. Он дал метку с текстом и выравниванием по левому краю и поставил ее на x=10, а затем сделал небольшую вторую метку того же цвета фона с шириной = 10 и выровнял ее рядом с реальной этикетка.

минимальный код и выглядит хорошо. Просто делает AutoLayout немного больше хлопот, чтобы все работало.