具有静态间距的UIStackView子类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有静态间距的UIStackView子类相关的知识,希望对你有一定的参考价值。
我正在创建UIStackView的子类,我希望间距是静态的,不可覆盖的。我认为这可以通过覆盖spacing
属性来完成:
class MyStackView: UIStackView {
override var spacing: CGFloat {
get { return 8.0 }
set {}
}
}
但是,这不起作用。永远不会调用getter,也不会显示间距。我找到的唯一解决方案是以下代码:
class MyStackView: UIStackView {
override init(frame: CGRect) {
super.init(frame: frame)
super.spacing = 8.0
}
override var spacing: CGFloat {
get { return 8.0 }
set {}
}
}
它实际上并不重要我在get
返回,它从来没有被任何东西调用。
任何人都可以解释这种行为以及如何避免它吗?
答案
在我看来,这是怎么回事。你想要实现两件事:
MyStackView
的间距默认为8.0
- 间距值不应该从外部改变
要实现首先需要覆盖初始值设定项并在其中设置默认值。
class MyStackView: UIStackView {
private let defaultSpacing: CGFloat = 8.0
override init(frame: CGRect) {
super.init(frame: frame)
super.spacing = defaultSpacing
}
required init(coder: NSCoder) {
super.init(coder: coder)
super.spacing = defaultSpacing
}
}
第二件事,你需要覆盖getter
的setter
和spacing
来控制外部的任何变化。
class MyStackView: UIStackView {
...
override var spacing: CGFloat {
get { return defaultSpacing }
set { print("MyStackView spacing it always (defaultSpacing)") }
}
}
为什么不能简单地覆盖变量并获得相同的结果?
计算UIStackView.spacing
属性,它不是容器。我们可能不关心原始的getter
是如何工作的,因为我们知道我们的间距总是相同的。我们知道它的价值,并且总是可以在重写的getter中返回它。
但我们也不知道原始的setter
是如何工作的,它在UIStackView
有什么变化。从那以后,我们不能简单地覆盖getter
。我们必须明确地调用super.spacing = defaultValue
一次,以触发原始的setter
并设置所需的值。
以上是关于具有静态间距的UIStackView子类的主要内容,如果未能解决你的问题,请参考以下文章