2

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

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

我在 iOS 5 上使用 Storyboard。

4

4 回答 4

4

要返回之前的视图,您不应该使用 Segue。只需使用以下代码行:

[self.navigationController popViewControllerAnimated:YES];

原始视图中的位置应保持原样。通过使用 Segue 推送到另一个视图(无论是前一个视图),您实际上创建了另一个视图控制器实例,如下所示:

VC A -> VC B -> VC A

您可以通过在 VC A 和 B 上添加另一个按钮来测试它,并使用上面的代码来验证您的 VC 是否按顺序弹出。您的 VC A 的滚动位置不会被记住,因为创建了一个新的 VC A 实例。如果您使用 segue,第一个 VC A 将永远可达。

于 2012-05-18T02:41:40.500 回答
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

于 2012-05-18T04:43:53.913 回答
0

当您执行转场时,这会将“新”场景推送到您的导航堆栈。如果该场景随后“弹出”(这将是新场景中 UINavigationController 的后退按钮的默认行为),则用户应自动返回到所需内容偏移处的原始视图。如果这没有发生,您可能会意外地推送原始视图控制器的新实例。您不应该执行额外的 segue,而是应该将顶视图控制器从导航堆栈中弹出。也就是说,您可以使用这种相当严厉的方法来确保内容偏移保持不变:

在执行 segue 之前,将属性设置为 scrollView 的 contentOffset 属性的值,例如:

-(void)prepareForSegue
{
    [self setScrollViewOffset:self.scrollView.contentOffset];
}

当此视图控制器准备再次出现时,将其设置为滚动视图的 contentOffset:

-(void)viewWillAppear
{
  [[self scrollView] setContentOffset:self.scrollViewContentOffset animated:NO];
}
于 2012-05-18T02:40:52.307 回答
0

为了让 UIScrollView 记住视图控制器转换之间的内容位置 UIScrollView.contentSize 应该在任何转换之前正确设置。

于 2013-03-22T20:50:59.623 回答