Background information on what is happening ---
extendedLayoutIncludesOpaqueBars essentially says that your look behaves as if the navigation bars are translucent. Your view will begin at the top (bottom) of the navigation panel, and not at the bottom of the panel.
Then the navigation controller sees that you have a scroll view, and automatically inserts it to compensate for the area covered by the panel.
In iOS 10, you can request contentInset and see the top = 64 insert. However, in iOS 11, the contentInset strictly for any custom inputs that you control, you must use the adjustedContentInset , which is the sum of your custom inserts and any safe areas.
adjustedContentInset - The insets derived from the content insets and the safe area of the scroll view. contentInset - The custom distance that the content view is inset from the safe area or scroll view edges.
So, offset y -63 makes sense, it's the same as what you saw if your bars were translucent.
The problem you are talking about , which your GIF demonstrates, I think is a mistake (see fooobar.com/questions/1272083 / ... ).
While the JoniVR answer should work, I solved it in my projects by setting extendedLayoutIncludesOpaqueBars = true .
Although this is probably not as important as you decide, extending the layout is better for me than changing the contentInsetAdjustmentBehavior . Setting for never has a wider range of potential effects; you say you never care about a safe area, no matter where the safe area comes from. The safe area may change (for example, during rotation) or if your controller is presented in different contexts / containers (for example, in the tab bar or not).