iOS 布局在 Xcode 11 上的 iOS 13 上中断 - 未调用 traitCollectionDidChange
Posted
技术标签:
【中文标题】iOS 布局在 Xcode 11 上的 iOS 13 上中断 - 未调用 traitCollectionDidChange【英文标题】:iOS layout breaks on iOS 13 on Xcode 11 - traitCollectionDidChange is not called 【发布时间】:2019-11-20 10:42:37 【问题描述】:TL;DR On Xcode 11 一些 ios 13 的应用程序布局被破坏(下面的操作系统很好)。当我转到后台并返回时,它是固定的...除非 UIUserInterfaceStyle 设置为 Light (!)
我正在处理一个去年没有开发过的旧应用程序。我正在使用最新的 Xcode (11.2) 和 Swift 4。当然,当您使用新的 Xcode 版本时,我期待一些编译问题,但一旦这些问题得到修复,我意识到以下几点:
应用在 iOS 13 上的布局不再正确,至少应用的某些视图。不过在 AppStore 上的布局不是问题,所以我猜它是 iOS 13 + Xcode 11 的问题(我在这里猜,我不知道是哪个 Xcode 版本用于构建当前的应用程序)。
更重要的是,当应用程序进入后台时,应用程序突然能够更新其约束,并且在返回后布局被修复。有一个例外,如果我在应用程序的 info.plist 上启用 UIUserInterfaceStyle 以点亮,则布局永远不会自行修复。
另一种奇怪的情况是,当您查看并弹出视图时,它会正确布局(在预览上,如果您使用该手势完成输入,也会在视图上)。如果peek & pop后不进入,以后正常进入,还是不会修复的。
【问题讨论】:
【参考方案1】:我不知道我是如何找到它的,但解决方案在 useyourloaf 的帖子上?
显然 iOS 13 现在能够在加载视图之前预测特征,因此在加载视图时不会再调用 traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)
!
有时我们需要知道设备的大小来调整一些约束,我们指望这个方法在那里做(改变时),但由于 iOS 已经检测到它,特征是在加载之前设置的,并且该方法永远不会叫。因此,应该将那段逻辑移到其他地方(viewDidLoad、layoutSubviews、...)。
这为我解决了问题。现在越来越多的事情开始变得有意义。但是我不知道为什么设置灯光样式会导致设备不会在后台触发该方法。
来源:https://useyourloaf.com/blog/predicting-size-classes-in-ios-13/
【讨论】:
以上是关于iOS 布局在 Xcode 11 上的 iOS 13 上中断 - 未调用 traitCollectionDidChange的主要内容,如果未能解决你的问题,请参考以下文章
iOS 上的 IDFA 和 IDFV 仍在使用 XCode 11 构建