Swift: получить значение Dynami c с плавающей запятой для темного / светлого режима - PullRequest
0 голосов
/ 24 февраля 2020

Я часто использую цвета semanti c следующим образом, чтобы получить динамические цвета c для темного и светлого режимов. При таком подходе цвета также будут обновляться во время выполнения, когда пользователь переключает темный / светлый режим:

public static var bw100: UIColor = {
    if #available(iOS 13, *) {
        return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in
            if UITraitCollection.userInterfaceStyle == .dark {
                // Return the color for Dark Mode
                return .black
            } else {
                // Return the color for Light Mode
                return .white
            }
        }
    } else {
        // Return a fallback color for iOS 12 and lower.
        return .white
    }
}()

Теперь я хочу сделать то же самое со значением Float, например, с плавающей точкой semanti c вар. Это означает, что я могу получить доступ к другому значению с плавающей запятой для темного режима и для светлого режима И значение будет адаптироваться во время выполнения, если пользователь переключит темный / светлый режим. Я не смог найти решение для этого.

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

 public static var myFloat: Float = {
    if #available(iOS 13.0, *) {
        if UITraitCollection.current.userInterfaceStyle == .dark {
            return 0.9
        }
        else {
            return 0.1
        }
    }
    return 0.1
}()

Это также НЕ работает (пробовал подход, аналогичный рабочему выше), но здесь я получаю ошибку Initializer init(_:) requires that (UITraitCollection) -> Float conforms to BinaryInteger

public static var myFloat: Float = {
    if #available(iOS 13, *) {
        return Float { (UITraitCollection: UITraitCollection) -> Float in
            if UITraitCollection.userInterfaceStyle == .dark {
                // Return the Float for Dark Mode
                return 0.9
            } else {
                // Return the Float for Light Mode
                return 0.1
            }
        }
    } else {
        // Return a fallback for iOS 12 and lower.
        return 0.1
    }
}()

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Вы не можете достичь чего-то идентичного тому, как UIColor работает с Float, так как UIColor имеет специальный инициализатор, который напрямую изменяет стиль интерфейса. Однако решение по-прежнему довольно простое, так как вы, как уже упоминалось, должны прослушать изменение стиля интерфейса путем реализации traitCollectionDidChange(_:) и пересчитать свои данные вручную.
Следующий код должен достичь вас:

// ViewController.swift

var myStoredFloat: Float = 1.0 {
    willSet {
        print(newValue)
    }
}

var myComputedFloat: Float {
    let tc = UITraitCollection.current
    let mode = tc.userInterfaceStyle
    if #available(iOS 13.0, *) {
        return (mode == .light ? 1 : 0)
    }
    return 1
}

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    self.myStoredFloat = self.myComputedFloat
}

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

* Благодаря matt для вычисляемого код недвижимости.

1 голос
/ 24 февраля 2020

Это работает для меня в режиме реального времени и очень близко к тому, что у вас есть:

static var myFloat : Float {
    let tc = UITraitCollection.current
    let mode = tc.userInterfaceStyle
    if #available(iOS 13.0, *) {
        return (mode == .light ? 1 : 0)
    }
    return 1
}

Как отмечает Лео Дабус, единственная реальная разница между тем, что вы делаете, и тем, что я Я получаю вычисленное свойство, которое пересчитывается каждый раз, когда вы выбираете его значение, тогда как у вас есть инициализатор define-and-call для свойства, которое никогда не изменяется после инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...