Обнаружение изменений в темном режиме iOS

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

Обнаружение изменения темного режима iOS

Как определить изменение режима Свет / Темнота в iOS 13?

У меня есть collectionView, который, когда я перехожу в темный режим и обратно, borderColor ячейки меняется на то, что выглядит черным, а не на цвет, который он должен основываться на цвете systemGray, который я ему назначил.

В ответах, которые я привел выше, люди предлагали использовать layoutSubviews () и / или traitCollectionDidChange (), но я не совсем уверен, где реализовать эти функции. Кажется, я не могу найти функции в определениях UIViewController или UICollectionView.

Когда я перезагружаю представления с помощью reloadData (), цвета меняются на те, которые должны быть, но я хотел бы знать, когда / где вызываются функции layoutSubviews () и / или traitCollectionDidChange ().


person gavido    schedule 28.09.2019    source источник
comment
Очень сложно помочь вам исправить ваш код, если вы его не показываете. Пожалуйста, отредактируйте свой вопрос и включите в виде текста соответствующий код, который вызывает вашу проблему.   -  person rmaddy    schedule 28.09.2019


Ответы (1)


Если вы хотите понять, как реализовать темный режим в iOS 13, я предлагаю вам посмотреть это видео wwdc. Однако, если вы просто хотите быстро понять, когда вызываются методы, вот краткое изложение:

layoutSubviews(): метод layoutSubviews предназначен для UIView подклассов. Вы можете переопределить это в своих UIView подклассах следующим образом:

class CustomCollectionView: UICollectionView {
    override func layoutSubviews() {
        super.layoutSubviews()
        // your implementation here
    }
}

traitCollectionDidChange(): метод traitCollectionDidChange можно переопределить для UIViewController подклассов. Вы можете переопределить это в своих UIViewController подклассах следующим образом:

class CustomViewController: UIViewController {
    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        // your implementation here.
    }
}

Если вы хотите точно знать, когда тема изменилась, ваша реализация traitCollectionDidChange будет выглядеть примерно так:

public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)

    if #available(iOS 13, *), traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
        // handle theme change here.
    }
}
person Anthony    schedule 28.09.2019