【问题标题】:UIScrollView not scrolling to bottom in iOS 7UIScrollView 在 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 上按预期工作,但我更喜欢保留动画。

注意:不使用界面生成器

【问题讨论】:

    标签: ios iphone objective-c uiscrollview contentoffset


    【解决方案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

      【讨论】:

      • 我没有使用自动布局,也没有使用笔尖。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 2013-10-30
      • 2012-01-07
      相关资源
      最近更新 更多