一直在四处寻找,但我找不到帮助我的答案。我想知道当我在导航控制器中向前和向后移动时,如何在滚动视图中保持滚动位置。目前,当我转到导航控制器中的另一个视图时,滚动视图会重置并在我返回时位于顶部。任何代码将不胜感激。对不起,如果我的解释不够好。到目前为止,这就是我所拥有的,我知道这不起作用,但我该怎么办?
- (void)viewWillAppear:(BOOL)animated {
scrollView.contentOffset.y = scrollSave;
[super viewWillAppear:YES];
}
- (void)viewWillDisappear:(BOOL)animated {
CGFloat scrollSave = scrollView.contentOffset.y;
[super viewWillDisappear:animated];
}
答案 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];
}