检测 iOS 暗模式中的变化

gav*_*ido 2 swift ios13 ios-darkmode

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

检测 iOS 暗模式更改

如何检测 iOS 13 中的 Light\Dark 模式变化?

我有一个 collectionView,当我切换到暗模式和从暗模式切换时,单元格的边框颜色正在更改为黑色,而不是它应该基于我分配给它的 systemGray 颜色的颜色。

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

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

Ant*_*ony 8

如果您想了解如何在 iOS 13 中实现暗模式,我建议您观看此wwdc 视频。但是,如果您只想快速了解调用方法的时间,这里有一个总结:

layoutSubviews()layoutSubviews方法用于UIView子类。您可以在自己的UIView子类中覆盖它,如下所示:

class CustomCollectionView: UICollectionView {
    override func layoutSubviews() {
        super.layoutSubviews()
        // your implementation here
    }
}
Run Code Online (Sandbox Code Playgroud)

traitCollectionDidChange():可以为子类覆盖traitCollectionDidChange方法UIViewController。您可以在自己的UIViewController子类中覆盖它,如下所示:

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

如果您想特别知道主题何时发生变化,那么您的实现traitCollectionDidChange将类似于:

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

    if #available(iOS 13, *), traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
        // handle theme change here.
    }
}
Run Code Online (Sandbox Code Playgroud)