8

I have a UIViewController in Interface Builder, and I add a UIScrollView to the UIView. It has a contentOffset property equal to 0.0, but when I scroll the UIScrollView to the very bottom and push another view the contentOffset changes.

NSLog gives me the following values:

//View just loaded
2013-09-09 16:19:27.455 my_app[24588:907] Scroll View content offset is 0.000000

//We came back from another view
2013-09-09 16:19:30.957 my_app[24588:907] Scroll View content offset is 108.000000

What's the reason of this behaviour? I've just added a UIScrollView in IB and did nothing in code at all.

The contentHeight of the scrollView is bigger than self.view.height. The frame of the scrollView stays the same.

Steph Sharp
  • 10,659
  • 4
  • 42
  • 79
Sergey Grischyov
  • 11,729
  • 18
  • 76
  • 117

6 Answers6

12

For iOS 7/8 self.automaticallyAdjustsScrollViewInsets = NO; solved the problem.

Alex
  • 2,468
  • 1
  • 18
  • 16
  • 1
    Be careful, this is just for iOS7 min – jc_35 Feb 18 '14 at 18:07
  • This was the best fix for me, setting the contentOffset to 0 caused a visible jump. – William Robinson Dec 09 '14 at 08:46
  • Thiis does not fix it for me a and I have to follow the guidelines in the accepted answer and manually update the `contentOffset` in `viewDidLayoutSubviews` . Any idea what is going on with that problem - its 2015 ! – Petar Jul 15 '15 at 08:32
10

See my answer to a similar question.

You need to set the scrollview's contentOffset appropriately in viewWillAppear: and viewWillDisappear:.

Also, see this:

Community
  • 1
  • 1
Steph Sharp
  • 10,659
  • 4
  • 42
  • 79
3

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!

Chuy47
  • 2,271
  • 1
  • 26
  • 27
3

When you leave the screen where the scrollview is present and come back, it will add half of the size of the screen on top or left or both. A blank space, something you don't want. And in my case, the paging becomes a mess and doesn't work properly, until I put the scroll in the CGPointZero programatically or by touch, as an user. If you call NSLog( @"%f", scrollview.contentSize.height ); on viewDidLayoutSubviews you'll see that the size has changed.

It happens on the axis which the offset value is not zero. So, to solve it, you should set it to zero CGPointZero before it appears.

The @Steph Sharp answer solve my problem except if I open a viewcontroller as a popup (presentViewController). I tried to compensate the value by adding the bug amount on viewDidLayoutSubviews but it bugs the paging.

Short answer, I end up with:

- (void) viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    scrollView.contentOffset = previousPoint;
}

- (void) viewWillAppear:(BOOL)animated
{
    scrollView.contentOffset = CGPointZero;
}

- (void) viewWillDisappear:(BOOL)animated
{
    previousPoint = scrollView.contentOffset;
    scrollView.contentOffset = CGPointZero;
}

Now it works when I leave the section or if I open a popup above.

Ratata Tata
  • 2,545
  • 29
  • 46
1

Check if the contentSize property of your scrollview is CGSizeZero. I had a similar problem because the contentSize had been not set.

Yongqiang Zhou
  • 302
  • 1
  • 10
0

I was using https://github.com/michaeltyson/TPKeyboardAvoiding on UITableView.

My solution was to remove class TPKeyboardAvoidingTableView from UITableView. It was causing scroll issue on TableViewController with static and dynamic cells.

Dave
  • 4,063
  • 3
  • 19
  • 35