swift - 最小化应用程序时避免调用 traitCollectionDidChange

标签 swift

我的应用程序有一个错误。这个错误的原因是 UIViewController 在 UI 主题从浅色变为深色或从深色变为深色后更新 UITableView 单元格。

我可以修复这个bug,这个bug本身不是问题。

但是,我注意到一些奇怪的行为。当我最小化我的应用程序时,两者

func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator)

func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)

被调用两次。我没有更改 UI 主题,但是当我将以下代码添加到我的 UIViewController

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator)
{
    super.willTransition(to: newCollection, with: coordinator)

    Swift.print("Changing to", newCollection.userInterfaceStyle == .dark ? "dark" : "light", "mode.")
}

我得到以下输出:

Changing to dark mode.
Changing to light mode.

就像我说的,我所做的只是最小化我的应用程序(按下主页按钮)。当实际更改 UI 主题时,它只会被调用一次,这很好。

我将在重新加载我的 UITableView 之前检查实际状态(即仅在应用程序状态处于非事件状态时重新加载它,这是使用通知中心更改 UI 主题时的状态),但我我只是好奇。这对我来说似乎是一个错误。

为什么在最小化应用程序时会触发两次委托(delegate)?

最佳答案

这是故意的。正如您可能知道的那样,iOS 会在退出应用程序之前截取屏幕截图,以便在通过应用程序切换器(多任务处理)时显示。自 iOS 13 以来,它在两种暗光模式下都截取了屏幕截图,因此非常简单地更改了特征集合。这样做是为了当用户在明暗模式之间切换时,应用程序切换器中的屏幕截图也会更新(您可以查看)。您应该优化您的应用以适应这种行为。

关于swift - 最小化应用程序时避免调用 traitCollectionDidChange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61917882/

相关文章:

ios - 如何使用 Urban AirShip (Swift) 获取 appDelegate

swift - UIAlertController 已完成并呈现,但在 viewDidLoad 期间未出现

swift - 光标移动到编辑格式化十进制文本字段时结束 - Swift

ios - 当将变量从两个不同的 View 转移到一个 View 时,变量会被替换

ios - Jenkins - 命令行构建 iOS 项目

ios - 我应该从 UIViewController 中的 firebase 加载数据到哪里

ios - 使用 Alamofire 5 下载多个 URL

swift - 即使我为 UICollectionViewDataSource 添加了方法,它也会给我一个错误

ios - 快速动态添加按钮

ios - 创建一个新 Realm