ios - 状态恢复期间的 UIAppearance 错误

标签 ios ios11 uiappearance ios12 state-restoration

更新

Matt 正确地指出我的原始项目在状态恢复方面存在错误。但是,即使在删除它之后,只要我在导航 Controller 中使用 TableView 并尝试设置 UINavigationBarisTranslucent 属性,我就能够重现问题通过外观代理为 false


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

Here是我在 GitHub 上创建的一个小项目来说明这个问题。首次启动时,ViewController 中的标签字体已正确设置为 22 磅。但是,如果触发状态恢复,则因为willFinishLaunching中的appearance方法,会是12点。

其实这个问题的起因并不是我原先想的UILabel.appearance(whenContainedInInstancesOf: [UITableViewCell.self]).font = UIFont.systemFont(ofSize: 12)。相反,UINavigationBar.appearance(whenContainedInInstancesOf: [GLXNavigationController.self]).isTranslucent = false 会导致这种行为。您可以轻松地自己验证。

解决此问题的一种方法是在 layoutSubviews 中再次设置字体,因为外观代理是在调用 layoutSubviews 之前应用的。但是,我不喜欢这种方法。

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

非常感谢任何帮助。

最佳答案

你做的状态恢复是错误的:

  • didFinishLaunchingWithOptions 更改为 willFinishLaunchingWithOptions

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

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

关于ios - 状态恢复期间的 UIAppearance 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52519261/

相关文章:

swift - 结合 CoreML 和 ARKit

ios - UINavigationBar改变了UIBarStyle,甚至认为UIBarStyle在UIAppearance中有所不同

swift - 将字符串类型转换为phoneNumber

ios - iOS 5和iOS 6之间的UIBarButtonItem外观差异

ios - 带悬垂的 UINavigationBar 自定义背景(iOS 5)

ios - swift 午睡框架 : do something before sending requests

objective-c - 检查GKScore实例是否具有上下文属性

ios - 如何在 Xcode 8 上使用自动布局为不同的屏幕尺寸调整对象大小?

objective-c - 如何调用 objective-c 中的方法?

ios - 使用按钮以编程方式更改方向 - iOS