在iOS暗模式下检测更改

时间:2019-09-28 17:20:36

标签: swift ios13 ios-darkmode

我在这里找到了几个与我所遇到的问题有关的问题,但是由于我对iOS开发还很陌生,所以我不确定人们如何/在何处实施他们的解决方案。由于我也是StackOverflow的新手,因此我无法评论他们的帖子,因此将不胜感激。

Detecting iOS Dark Mode Change

How to detect Light\Dark mode change in iOS 13?

我有一个collectionView,当我在暗模式下切换时,单元的borderColor会更改为看起来像黑色而不是颜色,它应该基于我分配给它的systemGray颜色。

在我上面链接的答案中,有人建议使用layoutSubviews()和/或traitCollectionDidChange(),但我不确定在哪里实现这些功能。我似乎在UIViewController或UICollectionView的定义中找不到函数。

当我使用reloadData()重新加载视图时,颜色会更改为应有的颜色,但是我想知道何时/何处调用layoutSubviews()和/或traitCollectionDidChange()函数。

1 个答案:

答案 0 :(得分:5)

如果您想了解如何在iOS 13中实现暗模式,建议您观看wwdc video。但是,如果您只是想快速了解何时调用这些方法,请参见以下摘要:

layoutSubviews()layoutSubviews方法适用于UIView子类。您可以像这样在自己的UIView子类中覆盖它:

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

traitCollectionDidChange()UIViewController子类可以覆盖traitCollectionDidChange方法。您可以像这样在自己的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.
    }
}