我正在使用具有扩展内容大小的UIScrollView,并在其中放置了许多对象。它像地图一样滚动。单击UIScrollView中的按钮将执行Segue并将用户带到另一个场景(UINavigationController中嵌入的另一个UIView)。在第二个场景中,单击另一个按钮将执行另一个Segue以返回到原始场景(UIScrollView,它像地图一样滚动)。
一切正常,除了返回原始场景时,它会回到默认位置。我如何让它记住原来的位置?想象一下,它是一张地图,并且通过返回它,它应该显示它停止的位置,并且用户不需要重新滚动到之前的位置。我怎么能这样做?
我在iOS 5上使用Storyboard。
答案 0 :(得分:4)
要返回上一个视图,您不应该使用Segue。只需使用以下代码行:
[self.navigationController popViewControllerAnimated:YES];
原始视图中的位置应保持不变。通过使用Segue推送到另一个视图(无论前一个视图),您实际上创建了另一个视图控制器实例,如下所示:
VC A -> VC B -> VC A
您可以通过在VC A和B上添加另一个按钮来测试它,并使用上面的代码来验证您的VC是否在序列中弹出。您的VC A的滚动位置不会被记住,因为创建了一个新的VC A实例。如果您使用segue,则可以访问第一个VC A.
答案 1 :(得分:1)
首先确保
scrollView.delegate=self;
在委托方法中,请记住scrollView.contentOffset.x作为类变量
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
self.offsetX = scrollView.contentOffset.x;
}
第三,从导航回来
-(void)viewWillAppear:(BOOL)animated{
CGRect frame=scrollView.frame;
frame.origin.x=self.offsetX;
[scrollView scrollRectToVisible:frame animated:NO];
}
如果垂直滚动,则更改offsetY
答案 2 :(得分:0)
执行segue时,会将“新”场景推送到导航堆栈。如果随后“弹出”该场景(这将是新场景中UINavigationController的后退按钮的默认行为),则应自动将用户返回到所需内容偏移的原始视图。如果没有发生这种情况,您可能会意外地推送原始视图控制器的新实例。您不应该执行额外的segue,而应该从导航堆栈弹出顶视图控制器。也就是说,您可以使用这种相当苛刻的方法来确保内容偏移量保持不变:
在执行segue之前,将属性设置为scrollView的contentOffset属性的值,例如:
-(void)prepareForSegue
{
[self setScrollViewOffset:self.scrollView.contentOffset];
}
当这个视图控制器准备再创建一个外观时,设置它的scrollview的contentOffset:
-(void)viewWillAppear
{
[[self scrollView] setContentOffset:self.scrollViewContentOffset animated:NO];
}
答案 3 :(得分:0)
要让UIScrollView记住视图控制器转换之间的内容位置,应在任何转换之前正确设置UIScrollView.contentSize。