Ios 具有静态间距的视图子类
我正在创建UIStackView的一个子类,我希望间距是静态的且不可覆盖。我认为这可以通过覆盖Ios 具有静态间距的视图子类,ios,swift,uikit,subclass,Ios,Swift,Uikit,Subclass,我正在创建UIStackView的一个子类,我希望间距是静态的且不可覆盖。我认为这可以通过覆盖间距属性来实现: class MyStackView: UIStackView { override var spacing: CGFloat { get { return 8.0 } set {} } } 然而,这是行不通的。永远不会调用getter,也不会显示间距。我找到的唯一解决方案是以下代码: class MyStackView: UIStack
间距属性来实现:
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
,以获得对来自外部的任何更改的控制
class MyStackView: UIStackView {
...
override var spacing: CGFloat {
get { return defaultSpacing }
set { print("MyStackView spacing it always \(defaultSpacing)") }
}
}
为什么不能简单地重写一个变量并得到相同的结果?
UIStackView.spating
属性是计算出来的,它不是一个容器。我们可能不在乎原始的getter
是如何工作的,因为我们知道我们的间距总是相同的。我们知道它的值,并且总是可以在重写getter时返回它
但我们也不知道原始的setter
是如何工作的,以及它在UIStackView
中做了哪些更改。因此,我们不能简单地覆盖getter
。我们必须显式调用super.spating=defaultValue
一次,以触发原始setter
并设置所需的值。您能尝试覆盖设置吗?除了init
,如果子类调用set
,您的覆盖将阻止它们被覆盖,对吗?是的,但在这种情况下,它是一个定制的UI组件,不被设计为被覆盖。所以我只想让间距始终保持在8.0
,不管怎样。那么,如果您的覆盖,set
,这不应该起作用吗?因为如果有人试图设置一个不同的值,覆盖set将不会使其生效。但是我确实在上面的代码中覆盖了set(使用set{}
)。也许。。。对于您的第一次尝试,请使用set{super.spating=8.0}
?感谢您的解释,这种方法似乎是合理的