在执行Segue之后,如何让UIScrollView记住位置?

时间:2012-05-18 02:33:49

标签: iphone ios uiview uiscrollview storyboard

我正在使用具有扩展内容大小的UIScrollView,并在其中放置了许多对象。它像地图一样滚动。单击UIScrollView中的按钮将执行Segue并将用户带到另一个场景(UINavigationController中嵌入的另一个UIView)。在第二个场景中,单击另一个按钮将执行另一个Segue以返回到原始场景(UIScrollView,它像地图一样滚动)。

一切正常,除了返回原始场景时,它会回到默认位置。我如何让它记住原来的位置?想象一下,它是一张地图,并且通过返回它,它应该显示它停止的位置,并且用户不需要重新滚动到之前的位置。我怎么能这样做?

我在iOS 5上使用Storyboard。

4 个答案:

答案 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。