По-моему, вот что происходит. Вы хотите достичь двух вещей:
- Интервал в
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
, потому что мы знаем, что наш интервал всегда одинаков. Мы знаем его значение и всегда можем вернуть его при переопределенном получателе.
Но мы также не знаем, как работает оригинальный setter
и какие изменения он вносит в UIStackView
. С тех пор мы не можем просто переопределить getter
. Мы должны явно вызвать super.spacing = defaultValue
один раз, чтобы вызвать исходный setter
и установить желаемое значение.