Как добавить дополнение к внутреннему размеру содержимого UILabel?

Я использую autolayout на iOS7, и у меня есть такая проблема:

Я помещаю UILabel в UIView, и я устанавливаю ограничения автоопределения, так что центр labelX = родительский центр просмотраX. Я не ограничиваю ширину метки. Когда я устанавливаю текст ярлыка во время выполнения, метка рисуется достаточно широко, чтобы текст мог поместиться, нет полей /paddings слева и справа. То, что я хочу, - это иметь прописку слева и справа, чтобы текст не начинался только там, где начинается метка. Рубить для этого можно было бы установить текст как "текст", но, конечно, это не путь:)

Как я могу достичь того, что хочу?

Ответы

Ответ 1

Вы можете расширить UILabel и переопределить intrinsicContentSize самостоятельно. Пожалуйста, убедитесь, что вы также установили textAlignment = NSTextAlignmentCenter.

-(CGSize)intrinsicContentSize{
    CGSize contentSize = [super intrinsicContentSize];
    return CGSizeMake(contentSize.width + 50, contentSize.height);
}

Swift 5.0

open override var intrinsicContentSize: CGSize {
    let size = super.intrinsicContentSize
    return CGSize(width: size.width + 16, height: size.height)
}

Это, вероятно, работает, только когда у вас есть только одна строка текста для отображения.

Ответ 2

Вы можете создать подкласс UILabel и переопределить intrinsicContent,

-(CGSize)intrinsicContentSize {
    CGSize s = [super intrinsicContentSize];
    s = CGSizeMake(s.width + 20, s.height);
    return s;
}

Это добавит пробел в 20 точек к ширине. Если вы хотите, чтобы текст был посередине, обязательно установите выравнивание текста в центр.

Ответ 3

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

Например, если вы хотите дать отладку 10pt для внутреннего содержимого UIButton, вы можете сделать что-то вроде следующего:

NSDictionary *padding = @{ @"padding" : @(button.intrinsicContentSize.width + 20) };
NSArray *buttonHConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[button(==padding)]|" options:0 metrics:padding views:NSDictionaryOfVariableBindings(button)];

Ответ 4

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