Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to remove the top and bottom padding of UIButton, when create it using auto layout?

When create UIButton with auto layout, the intrinsicContentSize always contain different top/bottom padding according to different text font size. I try to set contentEdgeInsets, but it not really works for top/bottom padding.

How to fix the padding to 0 or any constant value?

like image 724
zgjie Avatar asked Aug 07 '15 08:08

zgjie


2 Answers

After some experimentation, it appears that if you try and set contentEdgeInsets to all zeros, the default insets are used. However, if you set them to nearly zero, it works:

button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 0.01, bottom: 0.01, right: 0)

It also appears that the values get floor'd, so you won't actually get fractional padding.

like image 90
John Gibb Avatar answered Sep 30 '22 03:09

John Gibb


Updated for Swift 5

If you are wanting the button to size to its titleLabel's contents, I found that the only way to do so is by subclassing UIButton and overriding intrinsicContentSize. Hope this works for you!

class CustomButton: UIButton {
    override var intrinsicContentSize: CGSize {
        return titleLabel?.intrinsicContentSize ?? super.intrinsicContentSize
    }
}

If you need to use titleEdgeInsets, you can update your UIButton subclass like this:

class CustomButton: UIButton {
    override var titleEdgeInsets: UIEdgeInsets {
        didSet {
            invalidateIntrinsicContentSize()
        }
    }

    override var intrinsicContentSize: CGSize {
        var sizeWithInsets = titleLabel?.intrinsicContentSize ?? super.intrinsicContentSize
        sizeWithInsets.width += titleEdgeInsets.left + titleEdgeInsets.right
        sizeWithInsets.height += titleEdgeInsets.top + titleEdgeInsets.bottom
        return sizeWithInsets
    }
}
like image 33
mwahlig Avatar answered Sep 30 '22 03:09

mwahlig