【问题标题】:How do I make UIScrollView remember the position after a Segue is performed?执行 Segue 后如何让 UIScrollView 记住位置?
【发布时间】:2012-05-25 15:18:30
【问题描述】:

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

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

我在 iOS 5 上使用 Storyboard。

【问题讨论】:

    标签: iphone ios uiview uiscrollview storyboard


    【解决方案1】:

    要返回上一个视图,您不应该使用 Segue。只需使用以下代码行:

    [self.navigationController popViewControllerAnimated:YES];
    

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

    VC A -> VC B -> VC A
    

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

    【讨论】:

      【解决方案2】:

      首先确定

      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

      【讨论】:

        【解决方案3】:

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

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

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

        当这个视图控制器准备再次出现时,设置它的滚动视图的 contentOffset:

        -(void)viewWillAppear
        {
          [[self scrollView] setContentOffset:self.scrollViewContentOffset animated:NO];
        }
        

        【讨论】:

        • - (void)viewWillAppear:(BOOL)animated { [dashboardScrollView setContentOffset:dashboardContentOffset animated:NO]; } - (void)viewWillDisappear:(BOOL)animated { dashboardContentOffset = dashboardScrollView.contentOffset; }
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-08
          • 1970-01-01
          • 1970-01-01
          • 2012-03-11
          • 2012-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多