1

我有一个问题UIScrollView,如果我单击选项卡栏项目以切换到另一个 ViewController,然后返回 ViewController,UIScrollView我无法滚动回顶部。我必须在 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,...

4

2 回答 2

6

我一直在努力解决这个完全相同的问题!不幸的是,我无法确切地弄清楚发生了什么或导致它(Apple 方面的错误?),但我已经创建了一个看起来相当有效的解决方法。

我正在做的是在 viewWillDissapear 方法中,我将滚动视图边界高度位置保存在本地浮点变量中,然后将滚动视图完全重置到顶部。

然后在 didLayoutSubviews 方法中,我滚动回保存的位置。

这是我的代码。

用于存储最后滚动值并延迟实例化的设置变量:

@property (nonatomic) float lastScrollHeight;

@synthesize lastScrollHeight = _lastScrollHeight;

-(float)lastScrollHeight{
    if(!_lastScrollHeight) _lastScrollHeight = 0;
    return _lastScrollHeight;
}

视图完成布局子视图后,滚动到保存的值(第一次为零):

-(void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];
    [self.scrollView setContentOffset:CGPointMake(0.0f, self.lastScrollHeight) animated:NO];
}

每次视图消失时,完全“重置”滚动视图:

-(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 上回答问题!如果您觉得我的回答有用,请点击左侧的灰色向上箭头。

于 2013-03-22T16:29:53.123 回答
0

我不确定是否是这种情况,但不要忘记在 iphone(而不是 ipad)上:

您需要确保,如果您有 uiscrollview(tableview, uiwebview, uicollectionview),则此滚动视图是屏幕上唯一返回 scrollTopTop = YES 的滚动视图。

将所有其他设置为 scrollTopTop = NO。

于 2017-01-22T01:31:18.313 回答