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

Ios 使用自动布局创建UIButton时,如何删除其顶部和底部填充?,ios,objective-c,uibutton,autolayout,padding,Ios,Objective C,Uibutton,Autolayout,Padding,使用自动布局创建UI按钮时,intrinsicContentSize始终根据不同的文本字体大小包含不同的顶部/底部填充。我尝试设置contentEdgeInsets,但它实际上不适用于顶部/底部填充 如何将填充值固定为0或任何常量值?看看这是否有效。创建UIButton标题标签的垂直约束,而不是按钮本身。为Swift 5更新 如果您希望按钮的大小与标题标签的内容一致,我发现唯一的方法是将UIButton子类化并重写intrinsicContentSize。希望这对你有用 class自定义按钮:u

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


如何将填充值固定为0或任何常量值?

看看这是否有效。创建UIButton标题标签的垂直约束,而不是按钮本身。

为Swift 5更新

如果您希望按钮的大小与标题标签的内容一致,我发现唯一的方法是将UIButton子类化并重写intrinsicContentSize。希望这对你有用

class自定义按钮:ui按钮{
重写变量intrinsicContentSize:CGSize{
返回标题标签?.intrinsicContentSize??super.intrinsicContentSize
}
}
如果需要使用
titleEdgeInsets
,可以如下更新UIButton子类:

class自定义按钮:ui按钮{
覆盖变量标题插入集:UIEdgeInsets{
迪塞特{
InvalidateIntriseContentSize()无效
}
}
重写变量intrinsicContentSize:CGSize{
var sizeWithInsets=标题标签?.intrinsicContentSize??super.intrinsicContentSize
sizeWithInsets.width+=titleEdgeInsets.left+titleEdgeInsets.right
sizeWithInsets.height+=标题插入项.top+标题插入项.bottom
返回大小设置
}
}

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

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

另外,这些值似乎得到了
floor
'd,因此实际上不会得到分数填充。

CGFloat
有一个
最小正常值
值,该值对于这个不幸的UIKit黑客非常有效

someButton.titleEdgeInsets = UIEdgeInsets(top: .leastNormalMagnitude, left: .leastNormalMagnitude, bottom: .leastNormalMagnitude, right: .leastNormalMagnitude)
someButton.contentEdgeInsets = UIEdgeInsets(top: .leastNormalMagnitude, left: .leastNormalMagnitude, bottom: .leastNormalMagnitude, right: .leastNormalMagnitude)
仅将标题边缘插图归零只会将前导插图和尾随插图归零。因此,我们还必须将内容边缘插入置零,以将顶部和底部置零

为方便起见:

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

为我工作。谢谢奇怪的是,它在
Interface Builder
中转换回
0
,但在
.xib
/
.storyboard
文件中正确设置为
0.01
。这对我来说非常有效。另一个解决方案不起作用,因为autolayout只是采用了固有的contentSize。这是可行的。但是,在此之后设置
titleEdgeInsets
(或其他insets)似乎不起作用anymore@Jeroen我更新了我的答案,以演示如何使用此解决方案支持
titleEdgeInsets