Поведение отступления для новых системных цветов iOS 13 в iOS 12

В настоящее время я перехожу на Dark Mode, и я решил, что используя новые системные цвета, такие как systemBackground а также label в Интерфейсном Разработчике также просто работает, когда приложение запускается в iOS 12. Я наполовину ожидал получить ошибку компилятора, но вместо этого приложение выглядит как в легком режиме iOS 13. Очевидно, среда выполнения как-то переводит эти цвета для iOS 12.

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

1 ответ

Решение

Если вы посмотрите на XML раскадровки, вы увидите что-то вроде:

<color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>

Xcode 11 добавляет поддержку для обоих цветов. Какой бы механизм ни преобразовывал файл.storyboard в действия во время выполнения, он должен знать, какой цвет ему нужно использовать для iOS 13 и какой цвет использовать для iOS 12 и более ранних версий.

В коде вам нужно что-то вроде следующего:

extension UIColor {
    class var mySystemBackground: UIColor {
        if #available(iOS 13, *) {
            return .systemBackground
        } else {
            return .white
        }
    }
}
Другие вопросы по тегам