我从一个在线课程中获得了这段代码,该课程教授如何设置圆角。
我注释掉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()
吗?
答案 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
中所述)配置拐角半径。
但是如果由于某种原因以编程方式实例化一个按钮怎么办?在这种情况下,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