我的 UIScrollView
有问题,如果我单击一个标签栏项目切换到另一个 ViewController,然后返回到带有 UIScrollView
的 ViewController我无法滚动回顶部。我必须在 ViewControllers 和 UIScrollView
中的内容之间再次切换。正确显示。这个过程对用户来说真的很不舒服。这是我的代码:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self becomeFirstResponder]; // View as first responder
scrollView.scrollEnabled = YES;
[scrollView setUserInteractionEnabled:YES];
testLabel.text = @"there is a long, long text normally";
}
我没有故意设置 contentSize,因为
UIScrollView
根据此标签自动获取正确的高度。我的问题是如果我向下滚动然后切换到另一个 ViewController,当我再次回到这个屏幕时,我无法再向上滚动到顶部。一些进一步的信息:
使用自动布局,层次结构是:ViewController - View - UIScrollView - Label, ...
最佳答案
我一直在努力解决这个完全相同的问题!不幸的是,我无法确切地弄清楚发生了什么或导致它(Apple 方面的错误?),但我已经创建了一个看起来相当有效的解决方法。
我正在做的是在 viewWillDissapear 方法中,我将 ScrollView 边界高度位置保存在本地浮点变量中,然后将 ScrollView 完全重置到顶部。
然后在 didLayoutSubviews 方法中,我滚动回保存的位置。
这是我的代码。
用于存储最后滚动值并延迟实例化的设置变量:
@property (nonatomic) float lastScrollHeight;
@synthesize lastScrollHeight = _lastScrollHeight;
-(float)lastScrollHeight{
if(!_lastScrollHeight) _lastScrollHeight = 0;
return _lastScrollHeight;
}
View 完成布局 subview 后,滚动到保存的值(第一次为零):
-(void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
[self.scrollView setContentOffset:CGPointMake(0.0f, self.lastScrollHeight) animated:NO];
}
每次 View 消失时,完全“重置” ScrollView :
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
self.lastScrollHeight = self.scrollView.bounds.origin.y;
[self resetApplesBrokenScrollview];
}
-(void)resetApplesBrokenScrollview{
[self.scrollView setContentOffset:CGPointZero];
CGRect sFrame = self.scrollView.bounds;
sFrame.origin = CGPointZero;
self.scrollView.bounds = sFrame;
CGRect cFrame = self.contentView.frame;
cFrame.origin = CGPointZero;
self.contentView.frame = cFrame;
}
这是我第一次在 Stack Overflow 上回答问题!如果您觉得我的回答有用,请点击左侧的灰色向上箭头。
关于ios - 如果我在 UIViewController 和 UITabBar 之间切换,则无法滚动回顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14661606/