除非调用super.layoutSubviews(),否则自定义UIButton layoutSubviews()不起作用

时间:2016-02-23 23:54:50

标签: ios uibutton

代码:

class ViewController: UIViewController{

    var button = CustomButton()

    override func viewDidLoad(){
        super.viewDidLoad()
        button.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(button)
        //add constraints and etc.
    }
}

class CustomButton: UIButton{
    override func layoutSubviews() {
        super.layoutSubviews()
        self.layer.cornerRadius = self.layer.frame.width * 0.5
        self.setTitle("abc", forState: .Normal)
    }
}

问题1:为了让super.layoutSubviews()工作,我怎么来电setTitle()? (即cornerRadius确实设置但不是标题)

问题2:我尝试将layoutSubviews()中的代码放在drawRect()中,但这并不会更改cornerRadius

2 个答案:

答案 0 :(得分:2)

UIButton包含UILabel个子视图以显示其标题。如果您不致电super.layoutSubviews(),则该子标签无法正确设置。

答案 1 :(得分:1)

UIButton是一个UIView,它有自己的layoutSubviews实现。您仍然希望确保调用代码,从而调用super.layoutSubviews()另外到默认实现(而不是),您需要设置cornerRadiustitle,以便在调用super之后添加该代码。

如果您没有覆盖方法期间,则在调用layoutSubviews()时默认会调用UIView中的layoutIfNeeded。如果您覆盖它并且不要调用super.layoutSubviews(),那么您基本上只是删除了Apple的方法实现。

在覆盖UIViewController子类中的方法时,应该调用super.viewDidLoad()的原因相同。