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,所以你实际上不会得到分数填充.
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)
        为 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)
        我在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之前相同
这篇文章帮助我做对了。