Change a UIButton's text (padding) programmatically in Swift
Asked Answered
N

8

70

Still learning Swift and don't know Objective-C. I saw that in order to changing a button's text programmatically requires the use of titleEdgeInsets but I am not really sure how to use it.

I would like to change the text in the button (padding) in the bottom and both the left and the right.

Thanks for any responses and/or examples!

Nisbet answered 11/7, 2015 at 4:9 Comment(0)
E
175

Still valid for: iOS 12/Xcode 10/Swift 4.2/OSX 10.13.2


iOS 9.1/Xcode 7.1/Swift 2.1/OSX 10.10.5:

The method titleEdgeInsets didn't work for me. My button's frame tightly hugs the text (I didn't specify a frame size), and the frame has a red background color. After doing:

 myButton.titleEdgeInsets = UIEdgeInsetsMake(10,10,10,10)

the red background shrunk inwards by 10 pixels on each side, which meant that now some of the text was outside the red background. Using negative values had no effect on the original frame size.

I was able to get padding around the text, effectively making the frame bigger, by doing:

myButton.contentEdgeInsets = UIEdgeInsetsMake(5,5,5,5) 
Erg answered 9/1, 2016 at 14:54 Comment(4)
new method is called: UIEdgeInsets.init(top: #, left:#, :bottom: #, right: #)Prank
@Andrea, UIEdgeInsetsMake() is still in the docs: developer.apple.com/documentation/uikit/…Erg
@Andrea, Do you get a warning if you call UIEdgeInsetsMake(5,5,5,5) ?Erg
titleEdgeInsets is deprecated in iOS 15 :(Lasonyalasorella
M
63

iOS 10 and Swift 3 example

Tested and works on IOS 11 and Swift 4.

refineButton.contentEdgeInsets = UIEdgeInsets(top: 5, left: 0, bottom: 0, right: 0)
Majorette answered 20/12, 2016 at 15:4 Comment(2)
If the text is truncating, while use of titleEdgeInsets, replace it to contentEdgeInsets.Bufford
Note, contentEdgeInsets is deprecated in iOS 15Hybridize
T
31

You can add padding from top, left, right and bottom by doing these lines of code.

button.titleEdgeInsets.left = 10; // add left padding.
button.titleEdgeInsets.right = 10; // add right padding.
button.titleEdgeInsets.top = 10; // add top padding.
button.titleEdgeInsets.bottom = 10; // add bottom padding.
Tamaru answered 23/9, 2015 at 13:49 Comment(0)
B
27

You can also do this in the storyboard:
enter image description here

Bufford answered 22/11, 2017 at 10:37 Comment(4)
The question specified "programmatically"Anandrous
I don't pretend to a best answer. Just for fullness of information.Bufford
It was useful, @aeid sometimes I search "programmatically" because I couldn't find it in the storyboardOutfoot
I didn't search for programmatically or storyboard, because I don't care either way. Glad to know it's thereStiffnecked
P
6

For iOS 9.1/Xcode 7.1/Swift 2.1

@IBOutlet weak var ratingButton: UIButton!

override func viewDidLoad() {
    ratingButton.contentEdgeInsets = UIEdgeInsets(top:15,right:10,bottom:15,left:10)

    super.viewDidLoad()
}
Pathogenic answered 24/4, 2016 at 17:39 Comment(0)
R
2

With iOS 15 contentEdgeInsets is deprecated so you need to use the following...

var configuration = UIButton.Configuration.plain() // there are several options to choose from instead of .plain()
configuration.contentInsets = NSDirectionalEdgeInsets(top: 24, leading: 24, bottom: 24, trailing: 24)
button.configuration = configuration
Rotor answered 2/9, 2023 at 8:34 Comment(0)
O
-1

Or you can use a custom class if you don't want to define the properties everytime you create a button;

class UIPaddedButton: UIButton {
  let padding = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)

  required init?(coder: NSCoder) {
    super.init(coder: coder)
  }

  override init(frame: CGRect) {
    super.init(frame: frame)
  }

  override func titleRect(forContentRect contentRect: CGRect) -> CGRect {
    return contentRect.inset(by: padding)
  }
}

And when initializing;

let btn = UIPaddedButton()
Oneida answered 27/12, 2019 at 9:6 Comment(1)
this is not really correct. adjusting the titleRect is quite difficult. you have to follow a procedure similar to this: https://mcmap.net/q/23674/-adding-space-padding-to-a-uilabelBolster
S
-1

For xcode 13.4 and iOS 12 Tested and working To make space to both sides of a button

ButtonName.contentEdgeInsets = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
Subclinical answered 10/8, 2022 at 5:28 Comment(1)
unfortunately completely wrong, deprecated away :/Bolster

© 2022 - 2024 — McMap. All rights reserved.