问题标签 [uitraitcollection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
73 浏览

ios - 测试给定的 iPhone 是否支持展开模式下的拆分视图

在 iPhone 6(及更小机型)上,手机永远不会在“展开”模式下显示拆分视图。也就是说,拆分视图内的主视图控制器和辅助视图控制器始终按顺序显示。相比之下,在 iPhone 6Plus(和更大)上,手机在横向时会在展开模式下显示拆分视图。也就是说,主视图控制器和辅助视图控制器并排显示。

这给 UI 测试带来了问题。当设备是手机并且水平尺寸等级是紧凑型(iPhone 6 和更小)时,应该有一组测试。当设备是手机并且水平尺寸等级是常规时,应该有一组单独的测试。

不幸的是,在处理 UITests 中的 UIElements 时,我无法发现尺寸类的测试。执行 UI 测试时有没有办法获取 traitCollection 信息?

UIDevice 对象有一个“模型”属性。这是一个字符串。在模拟器上测试时,我从这个属性中看到的唯一值是“phone”或“pad”。手机的型号似乎不可用,Apple 的文档也不保证任何特定的价值。

UIDevice 对象也有一个 userInterfaceIdiom 属性。除了平板电脑和手机之外,此枚举还可以报告 CarPlay 和 Apple TV 等内容,但同样不会返回任何型号信息。

XCUIDevice 不报告特征环境或型号。

我的解决方法是在我的主项目中插入测试代码。在开始的场景中,我给其中一个元素一个可访问性标识符,它反映了初始水平尺寸等级。例如,如果有标题,则可访问性标识符变为“标题(紧凑)”或“标题(常规)”。这可以在设置期间在 UI 测试中进行询问,并且可以设置全局变量以供以后使用。然而,这是一个非常糟糕的组合。

我希望有人知道一个对象(可在 UI 测试中访问),它将返回如下内容:

那很好啊!

0 投票
1 回答
162 浏览

ios13 - 暗模式和多窗口/场景

我正在尝试在多场景应用程序中实现 ios13 暗模式。

不幸的是,当我关闭一个将其拖过屏幕边缘的场景时,traitCollectionDidChange 方法会被多次调用,并且总是使用不同的值,导致我的 UI 在暗模式和亮模式之间闪烁。

怎么了?

这是我的实现

这是控制台中记录的语句

当新场景出现时...

当添加的场景消失时......

与此同时,我没有更改为暗模式(总是亮)......所以我希望只是主题没有改变。

0 投票
1 回答
430 浏览

ios - 评估 UITraitCollection 的 hasDifferentColorAppearance(comparedTo:) 结果

在我的应用程序中,当 iOS 系统暗模式设置更改时,我需要进行一些自定义 UI 更改。根据https://developer.apple.com/videos/play/wwdc2019/214/,明确提到traitCollectionDidChange使用hasDifferentColorAppearance(comparedTo:).

文档说:

使用此方法可以确定更改当前环境的特征是否也会更改界面中的颜色。例如,更改 userInterfaceStyle 或 accessibilityContrast 属性通常会更改界面的颜色。

在我的视图控制器的子类中,我实现了

但在某些情况下,两者isSameUserInterfaceStyleisSameAcessibilityContrast评估true我没想到 ifhasDifferentColorAppearance(comparedTo:)也会返回true。我不喜欢解决 Apple 建议的 API 用法,但另一方面,如果userInterfaceStyle没有实际更改,我不想对我的 UI 进行不必要的更改。所以我不确定我是否应该依赖的结果,或者仅比较两个特征集合hasDifferentColorAppearance(comparedTo:)是否就足够了。userInterfaceStyle

0 投票
3 回答
8350 浏览

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

某些 UI 设置无法自动使用暗/亮模式更改为UIColor. 例如shadow在层中。由于我需要在深色和浅色模式下移除和放置阴影,因此我需要在某个地方放置updateShadowIfNeeded()功能。我知道如何检测当前的模式:

现在我把函数放在里面layoutSubviews,因为每次外观改变时都会调用它:

但是这个函数被称为A LOT。只有在userInterfaceStyle更改时才触发的正确功能是什么?

0 投票
2 回答
692 浏览

uicolor - iOS13:如何在资产目录中为提升的用户界面级别指定颜色

iOS 13 给我们带来了UIUserInterfaceLevel,可以是.base或者.elevatedUIView当在暗模式下使用升高的级别时,系统似乎会自动调整提供的颜色。

但是,似乎没有办法在资产目录中.elevated手动指定颜色,或者是吗?

唯一的方法似乎是通过新的 UIColor 构造函数

0 投票
1 回答
623 浏览

ios13 - hasDifferentColorAppearance is true when app is backgrounded

Apple recommends that we use traitCollectionDidChange and compare trait collections using hasDifferentColorAppearance to catch when dark mode is toggled, and act on it if we need to. Like this:

I use this to update the UI, clear some caches etc when switching between dark and light mode.

For some reason traitCollectionDidChange fires and hasDifferentColorAppearance evaluates to true every time my app is backgrounded, no matter if I have dark mode enabled on the device or not. It seems the previousTraitCollection and the current traitCollection never have matching interfaceStyles in this case. I would rather avoid doing the updates I do when the userInterfaceStyle changes if the userInterfaceStyle hasn't actually changed.

Is this a bug, or am I just missing something?

0 投票
2 回答
1370 浏览

ios - iOS:应用启动后,UIApplication.sharedApplication.keyWindow.rootViewController==nil

我从我那里调用了一些代码,这些代码viewWillAppear依赖于根视图控制器的 traitCollection 是否有效。令我惊讶的是,即使在 viewWillAppear 被调用时,UIApplication.sharedApplication.keyWindow.rootViewController它仍然是 nil,在它被设置makeKeyWindow并被调用很久之后。为什么会这样?究竟发生了什么?似乎一些合理的假设不再是正确的。

0 投票
0 回答
452 浏览

ios - 切换到深色模式时,未在自定义 UIView 子类上调用 traitCollectionDidChange

我创建了一个自定义UIImageView子类,它添加了一些自定义绘图。这工作正常,但现在我想调整课程以使用 iOS 13 暗模式。

我添加traitCollectionDidChange:到类中以获取样式更改的通知并相应地更新视图。但是,当样式更改(在设备设置中更新)时,不会调用该方法,因此视图无法处理更改并自行更新。

如何解决这个问题?

0 投票
1 回答
571 浏览

ios - 是否可以手动设置/切换每个应用程序的 UserInterfaceStyle / 暗模式?

在 iOS 13 上使用时,我已更新我的 iOS 11+ 以支持暗模式。当在设备设置中启用或禁用 UserInterfaceStyle / 暗模式时,这可以正常工作。

但是,我想为用户提供仅为我的应用程序激活/停用暗模式的选项。

使用开关覆盖/切换UserInterfaceStyle当前应用程序窗口没什么大不了的:

但是这种方法有两个缺点

  • 我想在暗模式、亮模式和系统首选项之间切换,其中前两个在当前系统设置上强制使用一种或另一种模式,第三个使用系统设置。但是设置后如何返回“使用系统设置”overrideUserInterfaceStyle呢?使用.unspecified似乎有效,但行为并未真正记录在案。是不是省着用?可以使用解决.uspecified(见评论)

  • 这仅适用于当前可用的窗口。但是,不同的第 3 方控件和库会创建自己的窗口(例如显示 toast 消息、弹出窗口等)。由于我无法控制这些窗口的创建,我无法覆盖它们的样式。

所以问题是:是否可以为整个应用程序动态覆盖 UserInterfaceStyle?

我知道我可以选择样式,Info.plist但这当然不能由用户更改。

0 投票
1 回答
571 浏览

ios - 如何检测 AppDelegate 中的暗/亮模式更改以重置全局 tintColor?

在我的 AppDelegate 中,我设置了全局色调颜色。当用户启用/禁用暗模式以重置全局色调时,如何通知我?

在我的 AppDelegate 中,我有:

启用/禁用暗模式时,我需要更新全局色调颜色。我怎样才能检测到这种变化?