目前我找到的唯一方法是进入设置并使用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
nm
在UIFoundation.framework
中找到了这些符号。它们被标记为小写字母"s",意思是显然"该符号位于未初始化的小对象数据段中。"。我不知道这是什么意思(我所了解的是它们既不是类也不是方法)。
搜索_getUIContentSizeCategory...
符号的网络上没有结果,但附近有另一个符号_getUIApplicationClass
。我搜索了那个,因为它听起来更加通用,并在一些WebKit源代码中找到了类似的东西。可能没什么用,但也许这是苹果内部的惯例。无论如何,这个例子并不能帮助我解决问题。
无论如何,感谢您阅读到这里。如果您还在,请问我的问题是:
我希望能够动态模拟动态类型大小偏好设置的值。这些反汇编符号可能有所帮助,但也许我走错了方向。感觉解决方案就在眼前,但我只是无法将所有部分组合在一起。将该值设置为启动参数很好,但并不能完全解决我的问题。同样,修改模拟器中的
plist
值对于自动化也很好,但并不能解决我的问题。是否有一种方法可以在运行时动态修改此值?
preferredContentSizeCategory
,但在iOS 11中似乎不再足够。我尝试交换UITraitCollection
的preferredContentSizeCategory
(getter)方法,但没有任何效果。这应该如何工作?另请参见此处。谢谢。 - meaning-matters