检测 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.
}
}
我在这里发现了几个与我遇到的问题相关的问题,但由于我对 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.
}
}