动态模拟 iOS 动态类型系统文本大小 (UIContentSizeCategory)
Posted
技术标签:
【中文标题】动态模拟 iOS 动态类型系统文本大小 (UIContentSizeCategory)【英文标题】:Dynamically Mocking iOS Dynamic Type System Text Size (UIContentSizeCategory) 【发布时间】:2017-05-09 20:30:21 【问题描述】:我想用不同的系统文本大小选择轻松测试我的应用程序,包括可访问性大小。这些可以在设置应用程序中设置(显示和亮度 => 文本大小或常规 => 辅助功能 => 更大的文本)。
目前我能找到的唯一方法是进入“设置”并使用 UI 更改值(编辑:partial solution 如下所述)。这是缓慢而麻烦的。我怀疑有一种方法可以使用私有 API 动态更改它,但我不知道如何。由于我的目标是仅将其用于调试,因此私有 API 的使用和调配很好(此代码不会进入生产环境)。
为了尝试找到一个私有 API 来执行此操作,我查看了一些逆向工程资源。我是反汇编程序、符号表、类转储和寻找可以使用的私有 API 的新手,但这是我迄今为止尝试过的:
我成功调配了-[UIApplication preferredContentSizeCategory]
(其他帖子说这在过去有效),但这并不影响从+[UIFont preferredFontForTextStyle:]
返回的结果。
使用反汇编器IDA发现+[UIFont preferredFontForTextStyle:]
在私有框架UIFoundation.framework
中。 (-[UIApplication preferredContentSizeCategory]
在 UIKit.framework
中,但反汇编看起来一点用都没有)。
就在我开始写这个问题时(总是这样),我发现了一个partial solution。可以在方案中设置启动参数以设置启动时的值。这很有用,但不是我想要的。
通过上述答案,我found 用户偏好的值显然存储在“位于模拟器data/Library/Preferences
目录中的com.apple.UIKit.plist
文件”中。我们需要的值可以从命令行实用程序plutil
设置。这也是一个进步!但我想在运行时动态改变它。
更多关于 IDA 的结果:
我真的不知道如何阅读反汇编,但+[UIFont preferredFontForTextStyle:]
似乎指向一个名为___UIFontForTextStyle
的符号,它似乎指向一些听起来很有趣的符号_getUIContentSizeCategoryUnspecified
和_getUIContentSizeCategoryPreferenceClass
我还在UIFoundation.framework
上使用命令行实用程序nm
找到了这些符号。它们标有小写字母“s”,显然是"The symbol is in an uninitialized data section for small objects."。我不知道这意味着什么(我所收集到的只是它们不是类或方法)。
在网上搜索 _getUIContentSizeCategory...
符号一无所获,但附近还有另一个符号 _getUIApplicationClass
。我搜索了那个,因为它听起来有点笼统,并且在一些WebKit source 中发现了类似的东西。可能什么都不是,但也许这是苹果内部的惯例。无论如何,这个例子并不能真正帮助我解决问题。
无论如何,感谢您到目前为止的阅读。如果你还在这里,我的问题是:
我希望能够动态模拟动态类型大小首选项的值。这些反汇编符号可能会有所帮助,但也许我走错了路。感觉解决方案很接近,但我无法将所有部分放在一起。
将此值设置为启动参数很好,但并不能完全解决我的问题。同样,修改 plist
中 Simulator 的值对自动化也有好处,但不能解决我的问题。
有没有办法在运行时动态改变这个值?
【问题讨论】:
【参考方案1】:好尴尬!我正在查看一些过时的 ios 9.x 文档,并错过了 UITraitCollection
在 iOS 10 中获得 init(preferredContentSizeCategory: UIContentSizeCategory)
和 var preferredContentSizeCategory: UIContentSizeCategory
,Brandon Williams 向我指出了这一点。这完美地满足了我的需求。
【讨论】:
我已经调配了 UIApplication 的preferredContentSizeCategory
,但这在 iOS 11 中似乎已经不够用了。我尝试调配 UITraitCollection
的 preferredContentSizeCategory
(吸气剂)方法,但没有任何效果。这应该如何工作。另见here。谢谢。【参考方案2】:
一种简单的方法是围绕UIFontMetrics
编写一个包装器,并通过它路由所有UIContentSizeCategoryDidChange
通知。它允许单元/UI 测试各种动态类型设置。 I wrote about it here.
【讨论】:
以上是关于动态模拟 iOS 动态类型系统文本大小 (UIContentSizeCategory)的主要内容,如果未能解决你的问题,请参考以下文章