在导航控制器中导航时如何保持滚动位置?

时间:2014-01-03 18:21:51

标签: ios uiscrollview uinavigationcontroller

一直在四处寻找,但我找不到帮助我的答案。我想知道当我在导航控制器中向前和向后移动时,如何在滚动视图中保持滚动位置。目前,当我转到导航控制器中的另一个视图时,滚动视图会重置并在我返回时位于顶部。任何代码将不胜感激。对不起,如果我的解释不够好。到目前为止,这就是我所拥有的,我知道这不起作用,但我该怎么办?

- (void)viewWillAppear:(BOOL)animated {
    scrollView.contentOffset.y = scrollSave;
    [super viewWillAppear:YES];
}

- (void)viewWillDisappear:(BOOL)animated {
    CGFloat scrollSave = scrollView.contentOffset.y;
    [super viewWillDisappear:animated];
}

3 个答案:

答案 0 :(得分:1)

上面的代码甚至不应该编译。您可以将此滚动位置保存在另一个变量中,但通常滚动位置不应该重置自己。您应该删除任何试图操纵内容偏移的代码,并在返回视图时查看是否将其恢复到正确的滚动位置。

答案 1 :(得分:0)

Kyle的回答应该让你存储变量好,但是在分配contentOffset.y时,尝试动画滚动视图。

[scrollView scrollRectToVisible:
CGRectMake(scrollView.frame.origin.x, scrollSave.y, scrollView.frame.size.width, scrollView.frame.size.height) 
animated:NO];

该代码将进入viewWillAppear。

答案 2 :(得分:0)

使用您当前的方法,scrollSave是在viewWillDisappear中声明的局部变量,因此您无法访问viewWillAppear中的值。您需要创建实例变量或属性。 (如果视图控制器仍在内存中,它应该维护contentOffset,这可能不是必需的

 @interface MyViewController ()
   @property (nonatomic) CGPoint scrollSave;
 @end

 @implementation MyViewController
 - (void)viewWillAppear:(BOOL)animated {
   [scrollView setContentOffset:self.scrollSave];
   [super viewWillAppear:YES];
 }

 - (void)viewWillDisappear:(BOOL)animated {
   self.scrollSave = scrollView.contentOffset;
   [super viewWillDisappear:animated];
 }

现在存在持久性问题。如果您导航回导航控制器,此视图控制器将从内存中释放。如果您需要保存用户位置,那么我建议使用NSUserDefaults。

 @interface MyViewController ()
   @property (nonatomic)  NSUserDefaults *defaults
 @end

 @implementation MyViewController
 - (void)viewWillAppear:(BOOL)animated { 
   CGPoint scrollSave = CGPointFromString([_defaults objectForKey:@"scrollSaveKey"]);
   scrollView.contentOffset = scrollSave;
   [super viewWillAppear:YES];
 }

 - (void)viewWillDisappear:(BOOL)animated {
   [_defaults setObject:NSStringFromCGPoint(scrollView.contentOffset) forKey:@"scrollSaveKey"];
   [_defaults synchronize];
   [super viewWillDisappear:animated];
 }