IOS7 : UIScrollView offset in UINavigationController

49,128

Solution 1

OK so i found the solution, I have set in my controller the property:

self.automaticallyAdjustsScrollViewInsets = false

I don't really understand the true benefit of this property though, (or why the default value is true)

The only documentation i found was there:

Update

In iOS 11 automaticallyAdjustsScrollViewInsets is deprecated

You should now use:

self.tableView.contentInsetAdjustmentBehavior = .never

I also encourage you to check this question and its answer to get a better understanding of those properties

Solution 2

@Justafinger's answer worked like a charm for me as well.

Just wanted to add that this setting can also be adjusted easily from the interface builder.

  1. Select your view controller
  2. Click the 'Attributes Inspector' tab
  3. Uncheck 'Adjust Scroll View Insets'
  4. Enjoy!

enter image description here

Solution 3

I was running into this same issue, but I found a rather odd property on the ViewController in interface builder that seems to have been causing this for me. There is an "Extend Edges" set of check boxes. I removed the "Under Top Bars" check, and everything started laying out properly for me.

Solution 4

With automaticallyAdjustsScrollViewInsets set to YES (the default setting) there is a mismatch in scrollview positioning between ios6 and ios7, so to make them consistent you need to disable this setting. However, ios6 will crash if it comes across automaticallyAdjustsScrollViewInsets, so you either need to make a programatic change of automaticallyAdjustsScrollViewInsets conditional on ios7 or else switch off the option using the storyboard/NIB

Solution 5

I had a similar problem, after dismissing a viewController, the contentOffset from my tableView was changed to (0, -64).

my solution was a little weird, I tried all the other answers but had no success, the only thing that fixed my problem was to switch the tableView position in the controls tree of the .xib

it was the first control in the parent View like this:

before

I moved the tableView right after the ImageView and it worked:

after

it seems that putting the table view in the first position was causing the trouble, and moving the table view to another position fixed the problem.

P.D. I'm not using autoLayout neither storyboards

hope this can help someone!

Share:
49,128
streem
Author by

streem

Hey, My name is Emilien Stremsdoerfer, I'm currently a Software Engineer and lead iOS at HER, the social network for LGBTQ+ women. Feel free to check my profile on Linkedin for more information https://www.linkedin.com/in/estremsdoerfer

Updated on September 30, 2020

Comments

  • streem
    streem over 3 years

    I'm currently migrating my app on ios 7 and I've been stuck for hours on the new navigationcontroller/bar management.

    Before, when we had a navigation controller, we had a snippet like this :

    UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:[[MainViewController alloc]init]];
    

    In interface builder, we had the choice to set an existing navigationbar for the view and everything match the content of the real view.

    OK so now, i have no clue of how to design properly with interface builder. I still have my snippet to initialize my navcontroller. However in the interface builder for my MainViewController if I set a status bar to translucent or opaque navigation bar, i have an offset of 44px at the top (see below).


    Interface Builder_________________________And the result


    Now, if i set status bar to none, there is no offset at top but since the view on simulator is smaller because of navigation bar the bottom of the view in interface builder is cut off.

    Interface Builder_________________________And the result

    I guess i'm really missing something here but i can't find any topic or apple info in iOS7 Transitions Guide about that.

    Thanks for your help


    EDIT

    As we can see in the pictures, the first child of the view is a UIScrollView which contains both labels, the problem does not appear when there is no scrollview. It also appears if it's a UITableView. If a label is outside the UIScrollView, there is no offset to that label.

  • streem
    streem over 10 years
    Well, i'm not using storyboard. However I'm not sure it's an ios6 to ios7 problem, the example above has been fully created with iOS 7. Moreover, I edited my question, it only appears (as far as i know) with uiscrollview and uitableview.
  • swhitman
    swhitman over 10 years
    Hmm interesting...Looking into this you can add variant="6xAndEarlier" to the top of the XIB in the document element, as this is the difference when flipping the bit I mentioned above. And FYI this issue happens for uiwebview as well for me.
  • p0lAris
    p0lAris over 10 years
    Great find. UIScrollView in storyboard is really complicated. I wish Apple makes it a bit seamless in future versions of Xcode.
  • scaryguy
    scaryguy over 10 years
    This code prevents my UIScrollView from scrolling. But without this I can't get rid off the offset. Weired...
  • Newtz
    Newtz about 10 years
    This flag can also be switched off in your storyboard/nib, the View Controller has an "Adjust Scroll View Insets" checkbox. I've been banging my head against a wall for so long now trying to sort out my problems with scroll views and auto layout, further complicated by supporting iOS 6 & 7. So thanks so much for finally providing a solution!
  • user779764
    user779764 about 10 years
    App document would tell you that setting navigationbar.translucent = YES would prevent navigationbar from pushing the content down. It is the biggest lie and costed me many hours of work until this post. In addition, you must set self.automaticallyAdjustsScrollViewInsets = NO; Thank you so much for this post!!!!!!! Apple and apple?
  • streem
    streem about 10 years
    I noticed this weird behavior, i believe the logic behind is that the scrollViewInsets are automatically ajusted when a scrollview is the first child. Otherwise it does not really make sense because your scrollview is probaby not full screen.
  • gdbj
    gdbj over 9 years
    I found that this caused my UIScrollView's bounds to shift down by the height of the nav bar (-64points). I manually overrode this to 0, but found the UISrollView would still scroll in the y-axis, and "snap" to an imaginary line at -64. Your solution solved this.
  • BountyBob
    BountyBob almost 9 years
    Fantastic, solved all my woes with my webviews in my scrollview.
  • Jayesh Miruliya
    Jayesh Miruliya about 8 years
  • Dmytro
    Dmytro about 8 years
    Yup, this one worked for me better than "Adjust Scroll View Insets"
  • Dominic Williams
    Dominic Williams almost 8 years
    Spent ages looking for this option in the UIScrollView properties and not the View Controller! Thanks!
  • Shubham Naik
    Shubham Naik over 7 years
    Have been struggling with this issue for long enough now. Can't thank you enough. previously tried hiding UINavigationBar entirely, but it had different issues associated with it.
  • Cœur
    Cœur almost 7 years
    doc link is dead