【问题标题】:traitCollectionDidChange being called multiple times when only going to backgroundtraitCollectionDidChange 仅在后台被调用多次
【发布时间】:2020-12-02 08:59:42
【问题描述】:

我发现,当将应用程序置于后台时,traitCollectionDidChange 方法被调用了两次,并且在实际上没有进行任何更改时显示特征集合不同。

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection;

为了确定外观样式是否已在明暗模式之间切换,我们使用了 hasDifferentColorAppearanceComparedToTraitCollection 方法。

BOOL hasUserInterfaceStyleChanged = [previousTraitCollection
                                     hasDifferentColorAppearanceComparedToTraitCollection:self.traitCollection];

问题是这始终是正确的,无论出于何种原因,当没有任何更改时,特征集合是不同的。见下文 UserInterfaceStyle 实际上是不同的,而实际上并非如此。

第一个触发器:

previousTraitCollection:

<UITraitCollection: 0x280228c00; UserInterfaceIdiom = Phone, DisplayScale = 2, DisplayGamut = P3, HorizontalSizeClass = Compact, VerticalSizeClass = Regular, UserInterfaceStyle = Light, UserInterfaceLayoutDirection = LTR, ForceTouchCapability = Unavailable, PreferredContentSizeCategory = L, AccessibilityContrast = Normal, UserInterfaceLevel = Base>

self.traitCollection:

<UITraitCollection: 0x28023b600; UserInterfaceIdiom = Phone, DisplayScale = 2, DisplayGamut = P3, HorizontalSizeClass = Compact, VerticalSizeClass = Regular, UserInterfaceStyle = Dark, UserInterfaceLayoutDirection = LTR, ForceTouchCapability = Unavailable, PreferredContentSizeCategory = L, AccessibilityContrast = Normal, UserInterfaceLevel = Base>

第二次触发:

previousTraitCollection:

<UITraitCollection: 0x28023b600; UserInterfaceIdiom = Phone, DisplayScale = 2, DisplayGamut = P3, HorizontalSizeClass = Compact, VerticalSizeClass = Regular, UserInterfaceStyle = Dark, UserInterfaceLayoutDirection = LTR, ForceTouchCapability = Unavailable, PreferredContentSizeCategory = L, AccessibilityContrast = Normal, UserInterfaceLevel = Base>

self.traitCollection:

<UITraitCollection: 0x28027d800; UserInterfaceIdiom = Phone, DisplayScale = 2, DisplayGamut = P3, HorizontalSizeClass = Compact, VerticalSizeClass = Regular, UserInterfaceStyle = Light, UserInterfaceLayoutDirection = LTR, ForceTouchCapability = Unavailable, PreferredContentSizeCategory = L, AccessibilityContrast = Normal, UserInterfaceLevel = Base>

在第二次触发时,特征集合已被反转,但仍然不同。在这种情况下,第一个特征集合和最后一个特征集合是正确的。

这是 Apple 的错误吗?为什么 traitCollectionDidChange 在将应用程序放入后台时被调用两次。

【问题讨论】:

    标签: ios objective-c ios-darkmode


    【解决方案1】:

    这实际上是一个功能:iOS 正在为您的应用 UI 制作多个快照,这些快照将显示在 App Switcher 中。由于用户可以在您的应用处于后台时更改为深色模式,因此 iOS 会在两种界面样式中生成快照以始终显示正确的样式。

    【讨论】:

    • 这里肯定还是有问题吗?有没有一种正确的方法可以准确地检测到外观模式发生了变化,而不是这样,所以我们只在绝对必要时才触发更新?
    • 对我来说似乎是正确的:系统截取 Light UI,切换到 Dark(第一次触发),截取屏幕截图(离屏),然后切换回 Light(第二次触发)。我认为相应地处理这种情况而不是试图避免它会很好。还是您遇到了问题?
    【解决方案2】:

    检查UIApplication.shared.applicationState != .background 是否在进入后台时拍摄应用快照时避免做事

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 2019-06-08
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      相关资源
      最近更新 更多