检测 iOS 深色模式的变化

Detecting Change in iOS Dark Mode

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

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

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

当我使用 reloadData() 重新加载视图时,颜色会更改为应有的颜色,但我想知道 when/where 正在调用函数 layoutSubviews() and/or traitCollectionDidChange() .

如果您想了解如何在 iOS 13 中实现深色模式,我建议您观看此 wwdc video。但是,如果您只是想快速了解何时调用方法,这里有一个摘要:

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.
    }
}