Trait collection changes in iOS 17 and code compatibility

I believe when trait collections were first introduced, the values were unknown initially, so you could put code that accessed those values in traitCollectionDidChange because it always changed from unknown to known values.

An iOS update changed this behavior to provide an estimated initial value, so traitCollectionDidChange would only get called if its value changed from its initial value. This required us to optimize for the trait collection in viewDidLoad for example to handle its initial value and handle changes in traitCollectionDidChange.

In iOS 17, it’s stated if you access traits before the view is added to the hierarchy, the values won’t be up-to-date. It’s recommended to use viewIsAppearing instead of viewDidLoad and viewWillAppear. traitCollectionDidChange is still invoked but deprecated replaced with a new registration API to be informed when a value changes.

My question is, will the code written using the previous approach still work when compiled with the iOS 17 SDK? Meaning, does the system still provide an estimated initial value and inform you if it changed upon getting added to the view hierarchy? Or is this a breaking change in behavior that will require us to rewrite our logic moving code that accesses the traitCollection from viewDidLoad to viewIsAppearing (and be really careful in doing so because this function is called every time the view appears not just once)? Are there any scenarios where the code written for iOS 16 would stop working once compiled for iOS 17 if you access trait values in viewDidLoad and handle changes in traitCollectionDidChange?

I’m trying to understand if I can keep my existing code and use the new approach going forward or if I need to revisit existing code that utilizes trait collections. Thanks!

Accepted Reply

traitCollectionDidChange should continue to work as it has previous to iOS 17 and you can migrate your code to the newer notifications piecemeal. While it isn't specifically required to migrate your trait access code, do keep in mind that viewDidLoad has never been able to produce more than an estimate of what your view hierarchy might look like (e.g. the sizing for your views isn't know there either).

Replies

traitCollectionDidChange should continue to work as it has previous to iOS 17 and you can migrate your code to the newer notifications piecemeal. While it isn't specifically required to migrate your trait access code, do keep in mind that viewDidLoad has never been able to produce more than an estimate of what your view hierarchy might look like (e.g. the sizing for your views isn't know there either).