如何从模态转换返回后重置我的UIScrollView的位置?

我有一个简单的视图,包含一个很长的视图与许多button,整个东西在一个UIScrollViewscroller工作正常,我可以scroll到底部,然后单击button 。 每个button触发一个模式seque to另一个view 。 这个新的view然后被用户交互解散,导致原来的UIScrollView's view再次加载。

这里的问题是:如果我点击一个button到UIScrollView的顶部,我input模式segue ,closures新的view ,并返回到UIScrollView's view没有问题。 但是,如果我点击UIScrollView底部的button之一,当我返回seque出,然后转换回来,我的滚动都搞砸了。 我只能看到我的scroller 下面的区域,不能再scroll到顶端了!

我敢肯定,必须有一些方法来重置UIScrollView's ViewWillAppear UIScrollView's起点和终点,但我无法弄清楚。 任何帮助表示赞赏!

另外,仅供参考,我只是通过接口生成器添加了UIScrollView ,并没有在任何地方实现或合成它。

试试这个代码:

 - (void)viewWillAppear:(BOOL)animated { [yourscrollview setContentOffset:CGPointZero animated:YES]; } 

请注意:这个问题和答案的错误似乎在iOS 7中得到修复。其余的答案只与iOS 6(也许更早)有关。

这里展示的行为是UIScrollView类中的一个错误。 正如OP注意到的那样,从模态表示的UIViewController返回到包含UIScrollView的场景之后, UIScrollView将使用当前滚动的任何点,并开始performance为它的原点。 这意味着,如果在模态地呈现另一个视图控制器之前,您已经向下滚动了滚动视图,则在滚动视图返回到场景时不能向后滚动。

当您从视图层次中移除滚动视图并重新添加滚动视图时,即使不更改其窗口,也会发生同样的情况。

您可以通过将滚动视图的contentOffset设置回{0,0}然后在closures模式视图控制器之后再次显示该视图。 如果您实际上想要保留用户在触发模式之前滚动的点,那么重新显示UIScrollView 之后 ,您可以将contentOffset设置回原来的状态,然后重置它。

下面是一个UIScrollView子类,它修复了这个bug,无论何时从模态返回时, UIScrollView滚动视图重置为顶层:

 @interface NonBuggedScrollView : UIScrollView @end @implementation NonBuggedScrollView { CGPoint oldOffset; } -(void)willMoveToWindow:(UIWindow *)newWindow { oldOffset = self.contentOffset; self.contentOffset = CGPointMake(0,0); } -(void)willMoveToSuperview:(UIView *)newSuperview { oldOffset = self.contentOffset; self.contentOffset = CGPointMake(0,0); } -(void)didMoveToWindow { self.contentOffset = oldOffset; } -(void)didMoveToSuperview { self.contentOffset = oldOffset; } @end 

如果您希望在UIViewController执行此操作,而不是在UIScrollView子类中执行此操作,请更改viewWillAppear:viewDidAppear方法中的内容偏移量。

如果你不想保留用户的滚动位置,当他们从一个模式返回,只是想滚动UIScrollView返回顶部,因为OP要求,那么你所需要的是更简单:

 @interface NonBuggedScrollView : UIScrollView @end @implementation NonBuggedScrollView -(void)willMoveToWindow:(UIWindow *)newWindow { self.contentOffset = CGPointMake(0,0); } -(void)willMoveToSuperview:(UIView *)newSuperview { self.contentOffset = CGPointMake(0,0); } @end 

首先,感谢上面批准的答案。 有人提到,它不再适用,但我有一个滚动视图内的表格视图单元格,它需要重置单元格时重用。

这是Swift中的解决scheme。

 @IBOutlet var scrollView: UIScrollView! // many lines of code later inside a function of some sort... scrollView.setContentOffset(CGPointMake(0.0, 0.0), animated: false) 

要解决这个问题我使用这个代码:

 -(void) viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self.scrollview scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO]; } 

您可以通过调用scrollRectToVisible:animated:来更改开始点和结束点。 但我不确定这是否解决了您的问题。

使用下面的代码片段来恢复UIScrollview的滚动位置

声明“scrollPosition”variables为CGPointtypes。

 - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; //get the current offset scrollPosition = scrollView.contentOffset; //set current view to the beginning point self.scrollView.contentOffset = CGPointZero; } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; //retrieve the previous offset self.scrollView.contentOffset = scrollPosition; }