UIButton将图像左对齐并居中对齐

时间:2019-02-03 16:42:56

标签: ios swift xcode uibutton layoutsubviews

简介:

我有一个课程,该课程是UIButton继承。在此类中,我要 update 属性,例如titleEdgeInsetsimageEdgeInsetscontentHorizontalAlignment

我的第一种方法是使用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来计算文本和图像视图的位置

1 个答案:

答案 0 :(得分:1)

您可以在init的{​​{1}}中设置您上面提到的所有属性,因此绝对不需要在UIButtonlayoutSubviews中进行设置。 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

编辑:

这是您想要的吗?

enter image description here

enter image description here

无论文本是什么,文本始终居中,图像以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
    }
}

希望有帮助