swift - 在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()
何时我已经在观察者中设置了角半径?
解决方案
你问:
我想知道为什么我应该使用
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
}
}
推荐阅读
- c# - 通过来自不同应用程序服务器的存储连接字符串在 Azurestorage 上创建和访问 sqlite-DB
- python - 如何在 Python 中从混合 CSV 文件中读取 int 数据
- vb.net - File.ReadAllLines 在我的网络路径前面放了一个 C:
- karate - 空手道:如果该值不为空,则从一个响应中将值作为查询参数传递
- php - 无法在 Stripe webhook 中检索会话的变量值
- node.js - 如何限制模式内特定对象的填充
- azure-data-studio - 如何在 Azure Data Studio 的“SELECT TOP 1000”中更改默认值 1000?
- composer-php - 如何使用作曲家在 laravel 5.7 中安装社交名流?
- python-2.7 - 引发 MQMIError(rv[-2], rv[-1]) pymqi.MQMIError: MQI 错误。比较:2,原因 2085:失败:MQRC_UNKNOWN_OBJECT_NAME
- python - 如何根据公式在新数据框中组合时间序列?