如何在使用自动布局创建UIButton时删除UIButton的顶部和底部填充?

zgj*_*jie 12 objective-c padding uibutton ios autolayout

使用自动布局创建UIButton时,intrinsicContentSize始终根据不同的文本字体大小包含不同的顶部/底部填充.我尝试设置contentEdgeInsets,但它不适用于顶部/底部填充.

如何将填充修复为0或任何常量值?

Joh*_*ibb 27

经过一些实验,看起来如果你尝试设置contentEdgeInsets为全零,则使用默认的insets.但是,如果将它们设置为接近零,则可以:

button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 0.01, bottom: 0.01, right: 0)
Run Code Online (Sandbox Code Playgroud)

似乎值得到floor'd,所以你实际上不会得到分数填充.

  • 奇怪的是,它在“Interface Builder”中转换回“0”,而它在“.xib”/“.storyboard”文件中正确设置为“0.01”。 (2认同)

bso*_*sod 9

CGFloat具有一个leastNormalMagnitude非常适合这个不幸的 UIKit hack 的值。

someButton.titleEdgeInsets = UIEdgeInsets(top: .leastNormalMagnitude, left: .leastNormalMagnitude, bottom: .leastNormalMagnitude, right: .leastNormalMagnitude)
someButton.contentEdgeInsets = UIEdgeInsets(top: .leastNormalMagnitude, left: .leastNormalMagnitude, bottom: .leastNormalMagnitude, right: .leastNormalMagnitude)
Run Code Online (Sandbox Code Playgroud)

仅将标题边缘插图清零只会将前导和尾随插图清零。因此,我们还必须将内容边缘插入归零,以将顶部和底部归零。

为了方便起见:

extension UIEdgeInsets {
    init(repeating value: CGFloat) {
        self.init(top: value, left: value, bottom: value, right: value)
    }

    static let leastNormalMagnitude = UIEdgeInsets(repeating: CGFloat.leastNormalMagnitude)
}

someButton.titleEdgeInsets = .leastNormalMagnitude
someButton.contentEdgeInsets = .leastNormalMagnitude
Run Code Online (Sandbox Code Playgroud)


mwa*_*lig 8

为 Swift 5 更新

如果您希望按钮的大小适合其 titleLabel 的内容,我发现这样做的唯一方法是继承 UIButton 并覆盖内部内容大小。希望这对你有用!

class CustomButton: UIButton {
    override var intrinsicContentSize: CGSize {
        return titleLabel?.intrinsicContentSize ?? super.intrinsicContentSize
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您需要使用titleEdgeInsets,您可以像这样更新您的 UIButton 子类:

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
    }
}
Run Code Online (Sandbox Code Playgroud)


Con*_*sky 7

我在iOS 15中遇到了按钮标题周围额外填充的问题,因此我使用以下代码解决了该问题:

if #available(iOS 15.0, *) {
    detailsButton.configuration?.contentInsets = .zero

    // you could also keep padding that is more appropriate in your case
    detailsButton.configuration?.contentInsets = .init(top: 0, leading: 10,
                                                       bottom: 0, trailing: 0)
}
Run Code Online (Sandbox Code Playgroud)

您还可以在属性检查器中将 UIButton 的样式设置为Default. 它将使按钮的外观与iOS 15之前相同

这篇文章帮助我做对了。


yuf*_*yuf -1

看看这是否有效。创建对 UIButton 的 titleLabel 而不是按钮本身的垂直约束。