动态模拟 iOS 动态类型系统文本大小(UIContentSizeCategory)

17
我希望能够轻松地测试我的应用程序,包括辅助功能大小的不同选择。这些可以在设置应用程序中设置(显示和亮度 => 文本大小或常规 => 辅助功能 => 更大的文本)。
目前我找到的唯一方法是进入设置并使用UI更改值(编辑:下面描述了部分解决方案)。这很慢且繁琐。我怀疑有一种使用私有API动态修改它的方法,但我无法弄清楚如何操作。由于我的目标仅是用于调试,因此使用私有API和交换是可以接受的(此代码不会进入生产环境)。
为了尝试找到一个私有API来完成这个任务,我查看了一些反向工程资源。我对反汇编器、符号表、类转储和寻找可用的私有API都很陌生,但这是我迄今为止尝试过的内容。
  • 我成功地交换了-[UIApplication preferredContentSizeCategory](其他帖子说这在过去起作用),但这不会影响从+[UIFont preferredFontForTextStyle:]返回的结果。

  • 使用反汇编器IDA,我发现+[UIFont preferredFontForTextStyle:]在私有框架UIFoundation.framework中。(-[UIApplication preferredContentSizeCategory]UIKit.framework中,但反汇编看起来一点用处也没有。)

  • 就在我开始写这个问题时(总是这样),我发现了一个部分解决方案。可以在方案中设置一个启动参数来在启动时设置值。这很有用,但不是我想要的。

  • 通过上面的答案,我发现用户偏好设置的值显然存储在“模拟器的data/Library/Preferences目录中的com.apple.UIKit.plist文件中”。我们需要的值可以通过命令行实用程序plutil来设置。这也是一个进步!但我想在运行时动态地改变它。

关于我的IDA结果:

我不太懂如何阅读反汇编,但是+[UIFont preferredFontForTextStyle:]似乎指向一个名为___UIFontForTextStyle的符号,该符号似乎指向一些听起来很有趣的符号,名为_getUIContentSizeCategoryUnspecified_getUIContentSizeCategoryPreferenceClass

Disassembly for <code>___UIFontForTextStyle</code>

我还使用命令行实用程序nmUIFoundation.framework中找到了这些符号。它们被标记为小写字母"s",意思是显然"该符号位于未初始化的小对象数据段中。"。我不知道这是什么意思(我所了解的是它们既不是类也不是方法)。

搜索_getUIContentSizeCategory...符号的网络上没有结果,但附近有另一个符号_getUIApplicationClass。我搜索了那个,因为它听起来更加通用,并在一些WebKit源代码中找到了类似的东西。可能没什么用,但也许这是苹果内部的惯例。无论如何,这个例子并不能帮助我解决问题。

无论如何,感谢您阅读到这里。如果您还在,请问我的问题是:

我希望能够动态模拟动态类型大小偏好设置的值。这些反汇编符号可能有所帮助,但也许我走错了方向。感觉解决方案就在眼前,但我只是无法将所有部分组合在一起。
将该值设置为启动参数很好,但并不能完全解决我的问题。同样,修改模拟器中的plist值对于自动化也很好,但并不能解决我的问题。
是否有一种方法可以在运行时动态修改此值?
2个回答

7

非常尴尬!我正在查看一些过时的iOS 9.x文档,错过了在iOS 10中UITraitCollection新增的init(preferredContentSizeCategory: UIContentSizeCategory)var preferredContentSizeCategory: UIContentSizeCategory,这是由Brandon Williams友情提示给我的。这完美地满足了我的需求。


我已经交换了UIApplication的preferredContentSizeCategory,但在iOS 11中似乎不再足够。我尝试交换UITraitCollectionpreferredContentSizeCategory(getter)方法,但没有任何效果。这应该如何工作?另请参见此处。谢谢。 - meaning-matters

0

一种简单的方法是编写一个UIFontMetrics的包装器,并将所有UIContentSizeCategoryDidChange通知路由通过它。这允许对各种动态类型设置进行单元/UI测试。我在这里写了关于它的文章


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接