UIScrollView 在 iOS 7 中没有滚动到底部

Posted

技术标签:

【中文标题】UIScrollView 在 iOS 7 中没有滚动到底部【英文标题】:UIScrollView not scrolling to bottom in iOS 7 【发布时间】:2014-02-13 01:34:22 【问题描述】:

在以下代码示例中,self.contentView 指的是有问题的UIScrollView

// Scroll to bottom.
CGPoint bottomOffset = CGPointMake(0, self.contentView.contentSize.height - 
                                   self.contentView.bounds.size.height);
if (bottomOffset.y >= 0.0)

    [self.contentView setContentOffset:bottomOffset animated:YES];

奇怪的是,在 ios 6 中这工作得非常好,但在 iOS 7 中,滚动视图(假设它有一个垂直大于 frame.size.heightcontentSize)只会滚动到添加到的最底部子视图的最底部滚动视图。

例如,如果以下情况成立:

self.contentView.frame.size.height == 50.0
self.contentView.contentSize.height == 100.0

aSubView.frame.origin.y == 50.0
aSubView.frame.size.height == 20.0

滚动代码只会滚动到aSubView 可见; self.contentView.contentOffset.y == 20.0 而不是 self.contentView.contentOffset.y == 50.0,后者将位于整个滚动视图的底部。

这(当然)会发生,直到以编程方式将另一个子视图添加到 self.contentView(通过用户交互),然后一切都会自行纠正。

为了清楚起见,我在滚动代码之前和之后设置断点以测量对self.contentView.contentOffset 的更改。

其他有趣的事实,如果我删除 animated 并直接设置 contentOffset 它在 iOS 7 上按预期工作,但我更喜欢保留动画。

注意:不使用界面生成器

【问题讨论】:

【参考方案1】:

只有一行..你可以滚动到底部..!

[yourScrollview scrollRectToVisible:CGRectMake(yourScrollview.contentSize.width - 1, yourScrollview.contentSize.height - 1, 1, 1) animated:YES];

【讨论】:

【参考方案2】:

因此,我通过将调用包装在异步调度块中,很快找到了一个非常不令人满意的解决方案。

// Scroll to bottom.
CGPoint bottomOffset = CGPointMake(0, self.contentView.contentSize.height
                                   - self.contentView.bounds.size.height);
if (bottomOffset.y >= 0.0)

    dispatch_async(dispatch_get_main_queue(), ^
        [self.contentView setContentOffset:bottomOffset animated:YES];
    );

如果有人了解真正导致问题的原因并能提供更好的解决方案,我很乐意将其作为答案,但对于处理相同问题的其他人来说,希望这也适用于您。

【讨论】:

为什么不满意?动画代码应始终在主线程上运行,您只需确保它确实如此。您需要强制执行此操作并且应用程序不会自动使其在主线程上运行的内在原因必须与一些可能只有 Apple 工程师才能解释的内部工作原理有关。 这是不令人满意的,因为在 iOS 6 中,代码已经在没有调度块的情况下工作,而且这段代码无论如何都只在主线程上执行,所以它应该在没有额外的调度块的情况下工作。在执行这行代码之前,我必须强制程序等待当前的 Runloop 循环完成它正在执行的所有操作,这表明对调用该方法时实际发生的情况缺乏了解。 这种行为很奇怪。强制使用主队列解决了我遇到的滚动问题...感谢您的帮助。【参考方案3】:

禁用“调整滚动视图插图”为我解决了这个问题。 (Xcode 6,iOS 8)

【讨论】:

不涉及笔尖。你知道程序等价物是什么吗? self.automaticallyAdjustsScrollViewInsets = NO;【参考方案4】:

您可以在滚动视图的主视图的文件检查器窗格中取消选择“使用自动布局”。这可能对您有所帮助。 UIScrollView doesn't scroll after upgrading to iOS7 / xcode 5

【讨论】:

我没有使用自动布局,也没有使用笔尖。

以上是关于UIScrollView 在 iOS 7 中没有滚动到底部的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 - UIScrollView subView 不显示

iOS UIScrollView 的基本用法

为啥我不能在 iOS 7.0 中的 UIScrollView 中滚动?

iOS 7 自动布局 - UIScrollView 内的 UIImageView

在 iOS 7 中使用 UIScrollView 在 iOS 中创建水平滚动 UIButton

UIScrollView 在 iOS 7 上停止滚动