Подкласс константы NSLayoutConstraint на основе высоты экрана


У меня есть проект с панелью вкладок и пользовательской панелью навигации для каждой из вкладок. Каждый из UIViews панели навигации имеет константу ограничения высоты, установленную в раскадровке.

Я хотел бы подкласс этот NSLayoutConstraint (для высоты навигации), так что он изменяет высоту для iPhone X. панель навигации должна быть намного выше на iPhone X, и поскольку я не использую объекты "из коробки", мои ограничения должны быть установлены вручную.

По существу, я хочу сделать что-то вроде следующего в подклассе, поэтому мне не нужно повторять кучу кода и делать ненужные Выходы:

override func viewWillLayoutSubviews() {
    navBarHeightConstraint.constant = navBarHeightConstraintConstant()
}

func navBarHeightConstraintConstant() -> CGFloat {
    switch(UIScreen.main.bounds.height) {
    case 812: // iPhone X
        return 90
    default: // all others
        return 64
    }
}

Я создал подкласс, но не знаю, какие методы использовать для выполнения вышеуказанного кода.

class NavHeightFixiPhoneXConstraint: NSLayoutConstraint {

    // Nothing... yet!

}

Как я могу подкласс NSLayoutConstraint так, чтобы он отображал определенное значение только для iPhone X?

1 2

1 ответ:

Можно переопределить постоянную переменную:

class NavHeightFixiPhoneXConstraint: NSLayoutConstraint {

    override var constant: CGFloat {
        set {
            super.constant = newValue
        }
        get {
           return navBarHeightConstant()
        }
    }

    fileprivate func navBarHeightConstant() {
        switch (UIScreen.main.bounds.height) {
         case 812:
            return 90
         default: 
             return 64
        }
        layoutIfNeeded()
    }
}