首页 > 解决方案 > 在swift中设置cornerRadius时是否需要调用方法“awakeFromNib()”?

问题描述

我从一个教授如何设置圆角的在线课程中得到了这段代码。

我注释掉awakeFromNib() 和prepareForInterfaceBuilder()方法并运行模拟器,结果是一样的:按钮仍然显示圆角没有awakeFromNib().

@IBDesignable
class RoundedButton: UIButton {

    @IBInspectable var cornerRadius: CGFloat = 4.0 {
        didSet {
            self.layer.cornerRadius = cornerRadius
        }
    }

    override func awakeFromNib() {
        self.setUpView()
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        self.setUpView()
    }

    func setUpView() {
        self.layer.cornerRadius = 3.0
    }

}

我想知道为什么我应该使用awakeFromNib()以及prepareForInterfaceBuilder()何时我已经在观察者中设置了角半径?

标签: swiftuikit

解决方案


你问:

我想知道为什么我应该使用awakeFromNib()以及prepareForInterfaceBuilder()何时我已经在观察者中设置了角半径?

问题是如果您将按钮添加到情节提要场景并且根本没有@IBInspectable设置属性会怎样。您的图层的角半径永远不会设置为3( 或4),因为只有在初始化后随后发生更改时才会调用观察者。您需要确保没有不调用观察者的执行路径(或至少根据您的属性值更新图层的角半径)。您需要通过其中一种方法来配置角半径(或者,正如我将在下面讨论的那样,在 中init)。


但是,如果您出于某种原因以编程方式实例化一个按钮怎么办?在那种情况下,既awakeFromNib不会也prepareForInterfaceBuilder不会被调用!

所以,我建议在init. 这涵盖了所有场景:

@IBDesignable
class RoundedButton: UIButton {
    @IBInspectable var cornerRadius: CGFloat = 3.0 {
        didSet {
            layer.cornerRadius = cornerRadius
        }
    }

    override init(frame: CGRect = .zero) {
        super.init(frame: frame)
        setUpView()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setUpView()
    }
}

private extension RoundedButton {
    func setUpView() {
        layer.cornerRadius = cornerRadius
    }
}

我也不确定为什么您在var声明中有一个默认值,而在setUpView.


顺便说一句,另一种方法是使用从layer. 这避免了任何可能的混淆(例如,您以编程方式更改layer.cornerRadius其他地方,您是否真的希望此cornerRadius属性返回旧存储值而不是层实际使用的值)?

@IBDesignable
class RoundedButton: UIButton {
    @IBInspectable var cornerRadius: CGFloat {
        get { return layer.cornerRadius }
        set { layer.cornerRadius = newValue }
    }

    override init(frame: CGRect = .zero) {
        super.init(frame: frame)
        setUpView()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setUpView()
    }
}

private extension RoundedButton {
    func setUpView() {
        cornerRadius = 4.0
    }
}


推荐阅读