предоставление текстового поля / отступа для кнопки UiButton на Iphone - PullRequest
54 голосов
/ 19 марта 2011

У меня есть следующий макет, и я пытаюсь добавить отступ слева и справа ..

элементы управления отключены. enter image description here

Мой код для создания кнопки:

        UIButton *buttonTime = [[UIButton alloc] initWithFrame:CGRectMake(90, 10, 50, 20)]; 
        [buttonTime setBackgroundImage:[[UIImage imageNamed:@"bubble.png"] stretchableImageWithLeftCapWidth:9 topCapHeight:13] forState:UIControlStateDisabled];

        [buttonTime setTitle:@"27 feb, 2011 11:10 PM" forState:UIControlStateDisabled];             
        [buttonTime setTitleColor:[UIColor blackColor] forState:UIControlStateDisabled];
        buttonTime.titleLabel.font=[UIFont fontWithName:@"Helvetica" size:8.0]; 
        buttonTime.titleLabel.lineBreakMode= UILineBreakModeWordWrap;
        [buttonTime setEnabled:FALSE];
        [scrollView addSubview:buttonTime];
        [buttonTime release];

Ответы [ 9 ]

82 голосов
/ 21 октября 2014

Ответ Торо идеален.Вы также можете установить значения вставки из инспектора размера внутри раскадровки или xib.

enter image description here

71 голосов
/ 20 марта 2011
@property(nonatomic) UIEdgeInsets titleEdgeInsets;

Используйте это свойство для изменения размера и изменения положения эффективного прямоугольника рисования для заголовка кнопки. Вы можете указать разные значения для каждой из четырех вставок (сверху, слева, снизу, справа). Положительное значение сжимает или вставляет этот край, перемещая его ближе к центру кнопки. Отрицательное значение расширяет или опускает этот край. Используйте функцию UIEdgeInsetsMake, чтобы создать значение для этого свойства. Значением по умолчанию является UIEdgeInsetsZero.

30 голосов
/ 21 августа 2017

Установка вставок для содержимого предотвратит сокращение / усечение заголовка UIButton, добавив текстовое поле с отступом.

content edges

7 голосов
/ 21 апреля 2017

Проблема с принятым ответом заключается в том, что установка titleEdgeInsets является ограничением, как отмечено в документации Apple:

Это свойство используется только для позиционирования заголовка во время макета. Кнопка> не использует это свойство для определения intrinsicContentSize и> sizeThatFits (_:).

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

Альтернативный подход, учитывающий переменную длину заголовка, - оставить titleEdgeInsets в качестве значения по умолчанию. После того, как заголовок кнопки установлен, добавьте явные ограничения ширины и высоты, которые соответствуют метке заголовка кнопки и дополнительным полям. Например:

let margin: CGFloat = 10.0

let button = UIButton()

button.setTitle("My Button Title", for .normal)

button.widthAnchor.constraint(equalToConstant: button.titleLabel!.intrinsicContentSize.width + margin * 2.0).isActive = true

button.heightAnchor.constraint(equalToConstant: button.titleLabel!.intrinsicContentSize.height + margin * 2.0).isActive = true

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

3 голосов
/ 08 июня 2017

Эта опция также жизнеспособна, если не слишком раздражает использование подкласса UIButton

class Button: UIButton {
    override var intrinsicContentSize: CGSize {
        get {
            let baseSize = super.intrinsicContentSize
            return CGSize(width: baseSize.width + titleEdgeInsets.left + titleEdgeInsets.right,
                          height: baseSize.height + titleEdgeInsets.top + titleEdgeInsets.bottom)
        }
    }
}

Затем используйте titleEdgeInsets по желанию

 let button = Button()
 ... configure button
 button.titleEdgeInsets = ...
2 голосов
/ 23 сентября 2018

swift 4 Примечание: используйте contentEdgeInsets, а не titleEdgeInsets

btn.contentEdgeInsets =  UIEdgeInsetsMake(8, 8, 8, 8)
btn.titleLabel?.lineBreakMode = .byWordWrapping

Это заставит кнопку переносить текст и держать его на одной строке, пока есть место для него + добавляя некоторые отступы вокруг

2 голосов
/ 07 октября 2013

this ссылка работает как шарм с contentHorizontalAlignment property

1 голос
/ 11 ноября 2016

Я нашел простой / хакерский способ добавления границ к текстовым кнопкам (и с полями влево / вправо):

  1. Создать кнопку с заголовком.

  2. Поместите кнопку в раскадровку, выровняйте, где вы хотите, а затем добавьте принудительное ограничение ширины, которое является четным числом (я использовал 20, поэтому он добавляет 10 точек с каждой стороны). Это заставит границу вокруг ширины, которую вы создали.

  3. Используйте код для создания границы. например:

    myTextButton.backgroundColor = .clear
    myTextButton.layer.cornerRadius = 5
    myTextButton.layer.borderWidth = 2
    myTextButton.layer.borderColor = UIColor.white.cgColor
    
  4. Установите левый titleInset равным 2 через редактор (теперь в Size Inspector) или по коду. Это, кажется, центрирует текст, но это значение может быть различным для разных текстов и размеров текста.

Этот пост предназначен для XCode 8.1 и Swift 3.

0 голосов
/ 14 сентября 2018

С вышеупомянутыми решениями часть текста была вырезана, если у вас есть рамка вокруг кнопки.Например, метка кнопки с именем «Удалить что-то» в конечном итоге показывает «Удаление ...».Если у вас возникла эта проблема, вот решение:

aButton.contentEdgeInsets = UIEdgeInset.init(top: 0, left: 8, bottom: 0, right: 8)
...