如何移除UIButton配置titleLabel时的垂直偏移?支持手动自定义间距
问题描述
我目前的UIButton配置代码如下:
let addTo: UIButton = { let btn = UIButton() btn.titleLabel?.textAlignment = .center btn.titleLabel?.font = Theme.Font.sixteen.reqular btn.setTitle(LocalizedStrings.addTo.value, for: .normal) btn.setTitleColor(Theme.Color.blue, for: .normal) btn.contentVerticalAlignment = .top btn.contentHorizontalAlignment = .center btn.titleEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 0) return btn }()我希望移除titleLabel的上下间距,以便手动进行自定义配置。此前查询到的方案是通过
UIEdgeInsetsMake手动设置偏移值为10,请问是否存在无需手动设置偏移、直接让按钮取消垂直偏移的解决方案?
解决方案
当然有更优雅的解决方案!你可以通过重写UIButton的titleRect(forContentRect:)方法,直接接管标题区域的计算逻辑,完全摆脱系统默认的垂直偏移,无需手动设置固定数值的UIEdgeInsets。
方案1:自定义Button子类(推荐)
创建一个自定义的UIButton子类,重写标题区域的计算方法,让标题完全贴合按钮的内容区域:
class NoInsetButton: UIButton { override func titleRect(forContentRect contentRect: CGRect) -> CGRect { // 让titleLabel占据按钮的整个内容区域,无任何偏移 return contentRect } }
之后把你的按钮声明改成这个自定义类:
let addTo: NoInsetButton = { let btn = NoInsetButton() btn.titleLabel?.textAlignment = .center btn.titleLabel?.font = Theme.Font.sixteen.reqular btn.setTitle(LocalizedStrings.addTo.value, for: .normal) btn.setTitleColor(Theme.Color.blue, for: .normal) // 这里不需要再设置titleEdgeInsets了 return btn }()
这种方式的优势在于,系统不会再自动添加默认的垂直间距,你可以完全自由地自定义标题的位置,后续如果需要调整,直接修改titleRect(forContentRect:)里的逻辑即可,比硬编码inset数值灵活得多。
方案2:临时解决(无需子类)
如果你不想创建子类,也可以通过调整按钮的内容对齐方式和内边距来实现:
let addTo: UIButton = { let btn = UIButton() btn.titleLabel?.textAlignment = .center btn.titleLabel?.font = Theme.Font.sixteen.reqular btn.setTitle(LocalizedStrings.addTo.value, for: .normal) btn.setTitleColor(Theme.Color.blue, for: .normal) btn.contentVerticalAlignment = .fill // 让内容填充整个按钮垂直空间 btn.contentHorizontalAlignment = .center btn.contentEdgeInsets = .zero btn.titleEdgeInsets = .zero return btn }()
不过这种方式有时候会受系统默认布局逻辑的影响,不如自定义子类稳定,尤其当按钮状态变化(比如高亮、选中)时,可能还是会出现微小偏移,所以更推荐第一种自定义子类的方案。
内容的提问来源于stack exchange,提问作者Evgeniy Kleban
相关产品推荐
相关产品推荐

