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之前相同
这篇文章帮助我做对了。
| 归档时间: |
|
| 查看次数: |
4875 次 |
| 最近记录: |