简介:
我有一个课程,该课程是UIButton
的继承。在此类中,我要 update 属性,例如titleEdgeInsets
,imageEdgeInsets
,contentHorizontalAlignment
。
我的第一种方法是使用layoutSubviews
:
override func layoutSubviews() {
super.layoutSubviews()
// update properties
}
layoutSubviews
创建了一个无限循环,因此我已经搜索了另一种方法。
我的问题:
使用willMove
方法更新 UIButton
属性是一种常见的方法吗?
override func willMove(toWindow newWindow: UIWindow?) {
super.willMove(toWindow: newWindow)
// update properties
}
如果没有,为什么?
我的目标是使按钮的imageView左对齐(带有填充)并使文本居中。
更新:
我需要按钮frame.size和bounds.width来计算文本和图像视图的位置
答案 0 :(得分:1)
您可以在init
的{{1}}中设置您上面提到的所有属性,因此绝对不需要在UIButton
或layoutSubviews
中进行设置。
willMove(toWindow
将被多次调用,因此再次在此处重新设置这些属性是没有意义的。当将按钮添加到某个视图并加载按钮时,将调用layoutSubviews
,但您不必等到那时再设置这些属性。因为您已经有了button的子类,所以建议您
willMove(toWindow
不建议通过创建class SomeButton: UIButton {
override init(frame: CGRect) {
super.init(frame: frame)
self.titleEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
self.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
self.contentHorizontalAlignment = .center
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
的子类的方式,因此,如果您只想将这些属性分配给按钮,则可以扩展为UIButton
UIButton
编辑:
这是您想要的吗?
无论文本是什么,文本始终居中,图像以10像素填充填充到左侧
编辑2:
正如OP确认的那样,他希望按钮的样式如上图所示,并发布代码以实现相同的目的
extension UIButton {
func applyStyle() {
self.titleEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
self.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
self.contentHorizontalAlignment = .center
}
}
希望有帮助