问题标签 [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 投票
0 回答
558 浏览

ios - 如何为 UIFontMetrics 指定最小 UIContentSizeCategory?

我有一种基于动态类型创建自动缩放字体的方法,如下所示:

这似乎很好用;当我在手机设置中更改文本大小滑块值时,字体会根据需要进行缩放。

我现在正在尝试添加最小UIContentSizeCategory 的逻辑。也就是说,如果用户将他们的文本大小值设置为小于我指定的最小大小类别,则字体应该像他们选择了最小值一样缩放。

这是我的尝试:

通过日志,我可以看出,正如预期的那样,contentSize我传递给 UITraitCollection 初始化程序的值永远不会小于.large. 但是,传递给该初始化程序的值似乎代表了最大内容大小类别。也就是说,如果我像这样初始化特征集合:

let traitCollection = UITraitCollection(preferredContentSizeCategory: .large)

字体将为所有小于的 UIContentSizeCategory 重新缩放,.large但不会为大于 的任何类别重新缩放.large

有谁知道如何完成设置最小UIContentSizeCategory?

0 投票
1 回答
348 浏览

objective-c - traitCollectionDidChange 在 Objective-C 中没有正确触发

traitCollectionDidChangeswift课堂上使用成功触发dark mode更改。像这样:

效果很好。每次我在模式之间切换时都会触发。但是对于我的objective-c课程,delegate在暗模式和亮模式之间切换时不会触发。代码看起来类似:

我只能通过退出来触发它view,然后再重新进入。我在objective-c代码中遗漏了什么吗?

0 投票
0 回答
483 浏览

ios - 覆盖 UIView 的 UITraitCollection

我有一个UITabBar必须具有紧凑的horizo​​ntalSizeClass 的traitCollection。因为在常规的Horizo​​ntalSizeClass 上UITabBar,并排呈现 TabBarIcon 和 Title。

我做了子类UITabBar化并覆盖了 traitCollection getter 给我修改后的 traitCollection。

这可以完成工作,但是,我开始低于警告

MyTabBar 类覆盖不支持的 -traitCollection getter。如果您尝试覆盖特征,则必须使用适当的 API。

检查 Apple 文档后,我确实找到了一个 API,overrideTraitCollection(forChild:) 但是包含我的 UITabBar 的 viewController 需要有常规的 Horizo​​ntalSizeClass。

我还发现了一个类似的问题,但它没有回答我关于覆盖 traitCollection 的问题UIView

我不想覆盖 a 的 traitCollectionUIViewController而只是覆盖UIView.

覆盖 traitCollection 的正确方法是UIView什么?

0 投票
1 回答
3825 浏览

ios - 在 iOS 13 中覆盖 traitCollection

在我最初的视图控制器中,我有UITabbarController一个子视图控制器。

我想UITabbarController显示它UITabbar的 traitCollection 具有紧凑的 Horizo​​ntalSizeClass 以便在标签栏中,图像和标题显示为垂直对齐而不是并排。

iOS13 现在不支持覆盖 UITabbarController 的 traitCollection getter,Xcode 给出以下警告。

MyTabbarController 类覆盖不支持的 -traitCollection getter。如果您尝试覆盖特征,则必须使用适当的 API。

在研究了合适的 API 之后,我发现

在实现这个之后,我能够覆盖 myTabbarController 的特征集合,但只有在视图改变方向之后。仅当我将 viewWillTransition 覆盖为方法时,此 API 才有效。

我只能在设备旋转时覆盖特征。如果我尝试在任何其他视图控制器生命周期方法中覆盖特征集合,此 API 将不起作用。最初加载视图时如何覆盖 traitCollection?我尝试在viewDidLoad()我的初始视图控制器的方法中使用相同的代码,但它没有效果。

0 投票
2 回答
211 浏览

swift - Swift:获取暗/亮模式的动态浮点值

我经常通过以下方式使用语义颜色来为暗模式和亮模式提供动态颜色。使用这种方法,当用户切换暗/亮模式时,颜色也会在运行时更新:

现在我想对一个Float值做同样的事情,比如有一个语义浮点变量。这意味着我可以为暗模式和亮模式访问不同的浮点值,并且如果用户切换暗/亮模式该值将在运行时适应。我找不到解决方案。

这不起作用,因为它不会在运行时更新。暗/亮模式切换后必须重新启动应用程序:

这也不起作用(尝试了与上述工作类似的方法),但在这里我得到一个错误Initializer init(_:) requires that (UITraitCollection) -> Float conforms to BinaryInteger

0 投票
1 回答
252 浏览

swift - 您如何允许用户在 iOS 上打开应用程序时更改为深色或浅色模式?

我通过添加更新了我的应用程序中的视图以支持暗模式

然后,为了考虑到用户在应用程序后台运行并在切换模式后返回应用程序的情况,我在 viewDidLoad 中附加了一个观察者

触发功能

但是,self.traitCollection.userInterfaceStyle仍然提供旧值,因此需要完全重新加载视图才能对界面产生所需的更新。改用UIApplication.didBecomeActiveNotification没有区别。

0 投票
1 回答
1284 浏览

ios - 当用户在设置中更改外观时,应用程序不会更新并且 traitCollectionDidChange 不会触发

在我的应用程序中,我允许用户覆盖在设备上设置的外观。如果他们想要覆盖系统范围的外观,这是处理更新 UI 的类:

这有效 - 用户翻转开关,应用程序更改 userInterfaceStyle。问题是当用户更改系统范围的外观(在设置中设置亮或暗模式)时,应用程序不会自动更改外观,只有当他们手动设置时。

所以我假设当用户在系统范围内更改它时我需要做一些工作,而 traitCollectionDidChange 似乎是我需要使用的。问题是当用户更改设置中的外观时它不会触发,只有在我的应用程序中手动设置时才会触发。我在 viewController 中有这段代码来测试它:

当我手动覆盖时,它会打印“我们更改了样式模式”。当我进入设置并切换系统范围的外观时,traitCollectionDidChange 不会触发。

我发誓我在某个时候可以正常工作,但是当我使用 overrideUserInterfaceStyle 并且已经烧毁了很多代码更改时,我一直在尝试解决一些奇怪的问题。

我想我错过了一些明显的东西。在我开始允许用户覆盖之前,当外观在系统范围内更改而根本没有代码时,应用程序会在后台自动切换。现在它没有并且 traitCollectionDidChange 没有触发。我错过了什么或做错了什么?如果有帮助,很高兴提供更多代码。

谢谢!

0 投票
0 回答
832 浏览

ios - traitCollectionDidChange 从未在 UIView 子类上调用

我有一个UIViewController由另一个模态呈现的UIViewController。这UIViewController有一个UITableView带有自定义UIView设置的tableFooterView.

所以我遇到的问题是:切换设备的系统外观时,某些颜色无法正确显示。正如我所读到的,cgColor不会自动适应外观变化:

此属性中的颜色对象不会自动适应暗模式更改。如果使用它来设置界面元素的颜色,则必须在当前 trait 集合的 userInterfaceStyle trait 发生变化时自行更新该颜色。有关如何可靠地应用颜色信息的信息,请参阅在您的界面中支持深色模式。

https://developer.apple.com/documentation/uikit/uicolor/1621954-cgcolor

所以为了解决这个问题,我覆盖了这样使用的traitCollectionDidChange内部:UIViewcgColor

在该updateView方法中,我只是简单地更新了cgColor一些子层的属性,但是这个方法永远不会被调用。我尝试在具有相同问题superview的 中覆盖此方法。UIView它只会在UIViewController无用的级别上调用,因为tableFooterView在那个时间点尚未设置。

有什么想法可以解决这个问题吗?

0 投票
0 回答
458 浏览

swiftui - SwiftUI,视图中是否有类似 traitCollectionDidChange 的方法?

我正在研究 SwiftUI,看看它是否适合我们公司的用例。然而,我发现它相当简单,我想知道我是否遗漏了一些关键见解。

目前我正在研究 V/HStack 是否可以动态响应可访问性字体大小的变化。问题是我需要给项目一个框架,它不会自动将外部堆栈项目视图约束固定到它们的内部内容。当用户将字体大小设置为完整的香蕉模式时,用户界面就会中断。

结构 PatientHistoryView:查看 {

}

这是labDetailView

在此处输入图像描述 在 UIkit 中,这些问题可以在 traitCollectionDidChange 挂钩中解决。但是,在 Swift UI 中,我找不到等价物。

有人有什么想法吗?

谢谢!

0 投票
1 回答
675 浏览

ios - iOS 深色模式。用户界面样式在后台输入时来回更改

我支持暗模式。在我的一些视图控制器中,我traitCollectionDidChange(_)用于处理用户界面样式更改。

当我按下主页按钮并进入后台时,此方法会触发两次:

当我在 iOS 设置中更改外观并返回前台时,我得到

奇怪的。每次我进入后台时,我都会来回更改用户界面样式。为什么?