UIStackView подкласс со статическим интервалом - PullRequest
0 голосов
/ 05 сентября 2018

Я создаю подкласс UIStackView, и я хочу, чтобы интервал был статическим и не перезаписывался. Я думал, что это будет просто сделано путем переопределения свойства spacing:

class MyStackView: UIStackView {
    override var spacing: CGFloat {
        get { return 8.0 }
        set {}
    }
}

Это, однако, не работает. Получатель никогда не вызывается и интервал не отображается. Единственное решение, которое я нашел для этого, это следующий фрагмент кода:

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, в любом случае оно никогда не вызывается.

Кто-нибудь может объяснить это поведение? R и как этого избежать?

1 Ответ

0 голосов
/ 09 сентября 2018

По-моему, вот что происходит. Вы хотите достичь двух вещей:

  1. Интервал в MyStackView должен быть 8.0 по умолчанию
  2. Это расстояние не должно изменяться извне

Для достижения первой цели вам необходимо переопределить инициализаторы и установить для них значение по умолчанию.

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 и установить желаемое значение.

...