3

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

检测 iOS 暗模式更改

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

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

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

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

4

1 回答 1

9

如果您想了解如何在 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.
    }
}
于 2019-09-28T21:38:39.703 回答