快速设置cornerRadius时是否需要调用方法“ awakeFromNib()”?

时间:2019-04-03 07:50:14

标签: swift uikit

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

我注释掉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()吗?

1 个答案:

答案 0 :(得分:3)

您问:

  

我想知道为什么已经在观察者中设置拐角半径的情况下使用const ws = createServer(app); ws.listen(3000, () => { console.log("Listening on port 3000"); console.log("Creating subscription server"); new SubscriptionServer( { execute, subscribe, schema, onDisconnect(ws, ConnectionContext){ console.log("connectionContext", ConnectionContext, "end it"); // let token = ConnectionContext; // if (token != null && token != undefined) { // ChatService.disconnect(ConnectionContext); // } } }, { server: ws, path: "/graphql" } ); }); awakeFromNib()吗?

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


但是如果由于某种原因以编程方式实例化一个按钮怎么办?在这种情况下,initawakeFromNib都不会被调用!

因此,我建议在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