UILabel текстовое поле - PullRequest
       44

UILabel текстовое поле

297 голосов
/ 13 августа 2010

Я пытаюсь установить левую вставку / поле UILabel и не могу найти способ сделать это. У метки есть задний фон, поэтому просто смена источника не поможет. Было бы идеально вставить текст с помощью 10px или около того с левой стороны.

Ответы [ 38 ]

12 голосов
/ 16 июля 2015

Чтобы расширить ответ, предоставленный Броди Робертсоном, вы можете добавить IB Designable биты.Это означает, что вы можете настроить метку из раскадровки.

enter image description here

В вашей подклассе UILabel выполните

#import <UIKit/UIKit.h>

IB_DESIGNABLE

@interface insetLabel : UILabel

@property (nonatomic, assign) IBInspectable CGFloat leftEdge;
@property (nonatomic, assign) IBInspectable CGFloat rightEdge;
@property (nonatomic, assign) IBInspectable CGFloat topEdge;
@property (nonatomic, assign) IBInspectable CGFloat bottomEdge;

@property (nonatomic, assign) UIEdgeInsets edgeInsets;

@end

Затем выполните;

#import "insetLabel.h"

@implementation insetLabel

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        self.edgeInsets = UIEdgeInsetsMake(self.topEdge, self.leftEdge, self.bottomEdge, self.rightEdge);
    }
    return self;
}

- (void)drawTextInRect:(CGRect)rect
{
    self.edgeInsets = UIEdgeInsetsMake(self.topEdge, self.leftEdge, self.bottomEdge, self.rightEdge);

    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.edgeInsets)];
}

- (CGSize)intrinsicContentSize
{
    CGSize size = [super intrinsicContentSize];
    size.width  += self.edgeInsets.left + self.edgeInsets.right;
    size.height += self.edgeInsets.top + self.edgeInsets.bottom;
    return size;
}

@end

РЕДАКТИРОВАТЬ

Вероятно, вам следует добавить метод установки для edgeInsets.

10 голосов
/ 13 августа 2010

Если вы не хотите использовать дополнительный родительский вид для установки фона, вы можете создать подкласс UILabel и переопределить textRectForBounds:limitedToNumberOfLines:.Я бы добавил свойство textEdgeInsets или аналогичное, а затем сделал бы

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines
{
  return [super textRectForBounds:UIEdgeInsetsInsetRect(bounds,textEdgeInsets) limitedToNumberOfLines:numberOfLines];
}

. Для надежности вы также можете вызвать [self setNeedsDisplay] в setTextEdgeInsets :, но я обычно не беспокоюсь.

10 голосов
/ 17 декабря 2015

Может быть позже для вечеринки, но следующее просто работает.Просто подкласс UILabel.

#import "UITagLabel.h"

#define padding UIEdgeInsetsMake(5, 10, 5, 10)

@implementation UITagLabel

- (void)drawTextInRect:(CGRect)rect {
    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, padding)];
}

- (CGSize) intrinsicContentSize {
    CGSize superContentSize = [super intrinsicContentSize];
    CGFloat width = superContentSize.width + padding.left + padding.right;
    CGFloat height = superContentSize.height + padding.top + padding.bottom;
    return CGSizeMake(width, height);
}

- (CGSize) sizeThatFits:(CGSize)size {
    CGSize superSizeThatFits = [super sizeThatFits:size];
    CGFloat width = superSizeThatFits.width + padding.left + padding.right;
    CGFloat height = superSizeThatFits.height + padding.top + padding.bottom;
    return CGSizeMake(width, height);
}

@end
6 голосов
/ 07 января 2016

Вот быстрое решение.Просто добавьте этот пользовательский класс внизу вашего файла (или создайте для него новый файл) и используйте MyLabel вместо UILabel при создании ярлыка.

6 голосов
/ 01 апреля 2014

Если вы используете autolayout в iOS 6+, вы можете сделать это, настроив intrinsicContentSize в подклассе UILabel.

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.textAlignment = NSTextAlignmentRight;
    }
    return self;
}

- (CGSize)intrinsicContentSize 
{
    CGSize size = [super intrinsicContentSize];
    return CGSizeMake(size.width + 10.0, size.height);
}
5 голосов
/ 04 февраля 2015

В Swift это решается вот так.

class Label: UILabel {
    override func drawTextInRect(rect: CGRect) {
        super.drawTextInRect(UIEdgeInsetsInsetRect(rect, UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)))
    }
}
5 голосов
/ 23 мая 2014

Вместо UILabel возможно использовать https://github.com/mattt/TTTAttributedLabel

BITAttributedLabel *label = [BITAttributedLabel new];
label.font = font;
label.text = @"hello";
label.textInsets = UIEdgeInsetsMake(10, 10, 10, 10);
[label sizeToFit];
4 голосов
/ 22 февраля 2018

Это работает правильно с многострочными метками:

class PaddedLabel: UILabel {
    var verticalPadding: CGFloat = 0
    var horizontalPadding: CGFloat = 0

    override func drawText(in rect: CGRect) {
        let insets = UIEdgeInsets(top: verticalPadding, left: horizontalPadding, bottom: verticalPadding, right: horizontalPadding)
        super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
    }

    override var intrinsicContentSize: CGSize {
        get {
            let textWidth = super.intrinsicContentSize.width - horizontalPadding * 2
            let textHeight = sizeThatFits(CGSize(width: textWidth, height: .greatestFiniteMagnitude)).height
            let width = textWidth + horizontalPadding * 2
            let height = textHeight + verticalPadding * 2
            return CGSize(width: frame.width, height: height)
        }
    }
}
4 голосов
/ 03 июля 2018

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

В моей ситуации использование UIButton было лучшим решением, потому что:

  • У меня был простой однострочный текст
  • Я не хотел использовать UIView в качестве контейнера для UILabel (т.е. я хотел упростить математические вычисления для Autolayout в моей ячейке)
  • Я не хотел использовать NSParagraphStyle (потому что tailIndent работает неправильно с Autolayout - ширина UILabel меньше, чем ожидалось)
  • Я не хотел использовать UITextView (из-за возможных побочных эффектов)
  • Я не хотел создавать подкласс UILabel (меньше кода, меньше ошибок)

Именно поэтому использование contentEdgeInsets из UIButton в моей ситуации станет самым простым способом добавления текстовых полей.

Надеюсь, это кому-нибудь поможет.

4 голосов
/ 21 марта 2015

Во многих ответах отсутствует переопределение sizeThatFits. С помощью этого подкласса вы можете просто создать метку, установить отступы, а затем сказать label.SizeToFit () и вуаля.

import UIKit

class UILabelEx : UILabel
{
    var padding : UIEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

    override func drawTextInRect(rect: CGRect) {

        super.drawTextInRect(UIEdgeInsetsInsetRect(rect, padding))
    }

    override func sizeThatFits(size: CGSize) -> CGSize
    {

        var adjSize = super.sizeThatFits(size)
        adjSize.width += padding.left + padding.right
        adjSize.height += padding.top + padding.bottom

        return adjSize
    }
}
...