如何从模态转换返回后重置我的UIScrollView的位置?
我有一个简单的视图,包含一个很长的视图与许多button,整个东西在一个UIScrollView
。 scroller
工作正常,我可以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; }