it-roy-ru.com

iOS Добавить левый отступ в UILabel

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

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

ПРАВКА

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

enter image description here

64
ssantos

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


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

Я решил это, создав подкласс UILabel и переопределив drawTextInRect: вот так:

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

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

OR

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

ИЛИ написать собственную метку. визуализировать текст через coretext

24
Daij-Djan

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

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

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

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

Если вы используете системный шрифт iOS по умолчанию в UILabel, характеристики системного шрифта по умолчанию могут измениться в последующем выпуске iOS и внезапно привести к нежелательному смещению при изменении точного интервала вашего приложения. Это может случиться и происходит, например, шрифт «Сан-Франциско» заменил предыдущий системный шрифт iOS в выпуске iOS.

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

let six_per_em_space = "\u{2006}"

Также можно вырезать/вставить пространство из HTML-страницы непосредственно в текстовое поле UILabel в Интерфейсном Разработчике. 

Примечание: Прикрепленное изображение - это скриншот, не HTML, поэтому перейдите на связанную страницу , если вы хотите вырезать/вставить пространство.

 UNICODE spaces

15
clearlight

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

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

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

2
Francesco D.M.

Swift 5

Создайте файл под классом и присвойте ему метку в качестве пользовательского имени класса через раскадровку. Вот и все.

class PaddingLabel: UILabel {

    override func drawText(in rect: CGRect) {
        let insets = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 0)//CGRect.inset(by:)
        super.drawText(in: rect.inset(by: insets))
    }
}
1
Ganesh Pawar

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

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

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

 Padding with UIView and autolayout

Результат:

 Result

0
Olcay Ertaş