UIScrollview Autolayout Issue
The following code snippet in the containing view controller also seems to solve the problem, without relying on explicit sizes:
- (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; self.mainScrollView.contentOffset = CGPointZero;}
It does reset the content offset to the origin, but it seems that so do the other answers.
if you are still searching for an answer i found it today after two days of headbanging the wall. I will just paste you the code, but the most important thing is when you load your scrollView..
-(void)viewWillAppear:(BOOL)animated{ [scrollView setFrame:CGRectMake(0, 0, 320, 800)];}-(void)viewDidAppear:(BOOL)animated{ [scrollView setScrollEnabled:YES]; [scrollView setContentSize:CGSizeMake(320, 800)];}
all this is loaded before -(void)viewDidLoad
notice the height is in both instances 800, which is crucial for resolving this problem. good luck with your project ;)
I was using adam's solution, but started to have problems when i was dismissing with animated:YES. In my code, content offset gets set a while after viewWillAppear (as viewWillAppear appears to be too soon).
- (void)viewDidDisappear:(BOOL)animated{ self.scrollOffsetToPersist = self.scrollView.contentOffset; self.scrollView.contentOffset = CGPointZero; [super viewDidDisappear:animated];}- (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [[NSOperationQueue mainQueue] addOperationWithBlock:^ { self.scrollView.contentOffset = self.scrollOffsetToPersist; }];}
EDIT: another, better way is to reset it back in viewDidLayoutSubviews :)
- (void)viewDidLayoutSubviews{ [super viewDidLayoutSubviews]; if(!CGPointEqualToPoint(CGPointZero, self.scrollOffsetToPersist)) { self.scrollView.contentOffset = self.scrollOffsetToPersist; self.scrollOffsetToPersist = CGPointZero; }}