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