状态恢复期间的UIAppearance错误

时间:2018-09-26 13:46:44

标签: ios ios11 uiappearance ios12 state-restoration

更新

Matt正确地指出,我的原始项目在状态恢复方面存在错误。但是,即使将其删除,只要我在导航控制器内使用表格视图并尝试将isTranslucent的{​​{1}}属性设置为UINavigationBar,就能够重现问题。通过外观代理。


由于某些原因,当iOS恢复状态时,UIAppearance会覆盖false中设置的值。这让我很头疼,我想知道如何解决这个问题。我将其视为错误。

Here是我在GitHub上创建的一个小项目,用于说明此问题。首次启动时,viewDidLoad中标签的字体已正确设置为22点。但是,如果触发状态恢复,则由于ViewController中的出现方法,它将为12点。

实际上,此问题的原因并非我最初认为的willFinishLaunching。相反,UILabel.appearance(whenContainedInInstancesOf: [UITableViewCell.self]).font = UIFont.systemFont(ofSize: 12)会导致这种行为。您可以轻松地自己验证。

解决此问题的一种方法是在UINavigationBar.appearance(whenContainedInInstancesOf: [GLXNavigationController.self]).isTranslucent = false中再次设置字体,因为外观代理是在调用layoutSubviews之前应用的。但是,我不喜欢这种方法。

另一种可能的解决方案是为每个导航控制器手动设置layoutSubviews。这是我选择的解决方案,但我仍然觉得外观代理存在错误。至少,我们应该期望初始启动和状态恢复之间的行为一致。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您正在做错误的状态恢复:

  • didFinishLaunchingWithOptions更改为willFinishLaunchingWithOptions

  • 并确保willFinishLaunchingWithOptions包含对makeKeyAndVisible窗口的调用,即使它不包含其他内容。

shouldSaveApplicationStateshouldRestoreApplicationState的实现一起,构成了状态保存和恢复的任何实施所需的底层模板。