无法让 UIScrollView 工作

Posted

技术标签:

【中文标题】无法让 UIScrollView 工作【英文标题】:Can't get UIScrollView to work 【发布时间】:2014-01-26 12:48:24 【问题描述】:

这是一个故事板应用程序。我在默认情况下位于视图控制器中的UIView 之上添加了一个UIScrollView。然后我在滚动视图上添加了一些 UI 元素。在设计了 Scroll 视图的可视部分之后,我使用它的手柄将它垂直拉伸并向上推了一点,以便我可以看到该部分来设计屏幕的其余部分。完成后,我将滚动视图放回以适应视图。请注意,我没有调整滚动视图的大小以匹配 IB 的视图大小。

然后我将所有 4 个约束添加到滚动视图(超级视图的前导和尾随空间,超级视图的顶部和底部空间)。然后我选择了UIView,打开了尺寸检查器并将底部空间更改为superview的值为0。这会自动调整UIScrollView的大小以适应视图控制器。

然后我在viewDidLoad 方法中添加了以下代码行。

self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width, self.scrollView.frame.size.height);
self.scrollView.frame = self.view.frame;

但这不起作用。 UIScrollView 不会滚动。是的,滚动已启用。

谁能告诉我这里可能缺少什么?

谢谢。

编辑:

我找到了我的一个旧项目here。它利用了我刚刚在上面解释的方式,并且有效!不知道为什么它不再。

我还在这里添加了 demo project 来解决这个问题。

【问题讨论】:

您已将内容大小和框架设置为相同.. 所以滚动视图不会滚动。 此外,在viewDidLoad 期间,视图未完全布局,因此未设置尺寸(框架)。尝试将您的代码放入viewWillAppear @bobnoble 你是对的。我将代码移入 viewDidAppear 方法,并将 self.scrollView.frame.size.height 的值硬编码为 700,现在它可以工作了。我不明白的是,我以前的方式过去对我有用。我找到了我的一个旧项目(在这里)[www54.zippyshare.com/v/37137086/file.html].在其中,我将它放在 viewDidLoad 中,并且没有硬编码值。 @Isuru - 在您提供链接的示例项目中,滚动视图 contentSize 高度是用 self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width, 627); 硬编码的。 如果你用self.scrollView.frame.size.height替换它,它仍然有效。我真的不喜欢硬编码值。这就是为什么我正在寻找一种动态的方法。 【参考方案1】:

如果我正确理解了您的代码(视图的屏幕截图会有所帮助),您将滚动视图框架设置为视图的完整大小,然后将 contentSize 设置为视图的大小。仅当 contentSize 大于其大小时,滚动视图才会滚动。

【讨论】:

我有一个演示 Xcode 项目 here 如果可以请看一下。 对我来说看起来不错 - 主屏幕垂直滚动 我硬编码了滚动视图的高度并将这两行移动到viewDidAppear 方法。现在它起作用了。奇怪的是,我发现 this 我的旧项目在没有硬编码值的情况下工作得很好,而且在 viewDidLoad 方法中!有什么方法可以在不对滚动视图的高度进行硬编码的情况下使其工作?【参考方案2】:

这可能不是您问题的完整答案,但肯定会对您和其他人有所帮助。

要设计比UIScrollView 更大的视图,最好将UIView 作为UIScrollView 的子视图并将所有内容放在UIView 上,最后将 UIView 作为UISCrollView 的子视图。最后可以将UIView的大小设置为UISCrollView的内容大小。

干杯。 :)

【讨论】:

以上是关于无法让 UIScrollView 工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ios 中为 UIScrollView 设置对齐方式

让 UIScrollView 与 AutoLayout 一起工作

UiScrollView 高度不正确(没有 AutoConstraint)

缩放和重绘 UIScrollView 内容后设置 contentOffset

在 UIScrollview 中禁用对角线拖动

更改界面方向时UIScrollView上的奇怪跳转(ATPagingView)