In iOS 15, UIKit has extended the usage of the
scrollEdgeAppearance, which by default produces a transparent background, to all navigation bars. The background is controlled by when your scroll view scrolls content behind the navigation bar. Your screenshots indicate that you are scrolled to the top, and so the navigation bar has selected its
scrollEdgeAppearance over the
standardAppearance that it would use when scrolled, and on previous versions of iOS.
To restore the old look, you must adopt the new
UINavigationBar appearance APIs,
UINavigationBarAppearance. Remove your existing customizations and do something like this:
let appearance = UINavigationBarAppearance()
appearance.backgroundColor = <your tint color>
navigationBar.standardAppearance = appearance;
navigationBar.scrollEdgeAppearance = navigationBar.standardAppearance
In the general case, it is the last line
navigationBar.scrollEdgeAppearance = navigationBar.standardAppearance, which resolves the issue by having the
UINavigationBar use the same appearance for both its standard and edge states. Also note that this will cause the scroll view to underlap the navigation bar – we recommend against setting
UINavigationBar.isTranslucent = true.
You can also use the appearance proxy with the code above, but substituting
navigationBar.appearance().scrollEdgeAppearance = appearance for the last line (as you are constructing your own appearance object – the idea is to just make sure both scrollEdge and standard appearances are the same).