【问题标题】:UIScrollview won't scroll when Autolayout is used使用 Autolayout 时 UIScrollview 不会滚动
【发布时间】:2013-10-15 04:06:41
【问题描述】:

我有一个滚动视图,它有两个子视图 (iPad)。视图层次结构如下:

-- UIScrollView
   -- UIView1
   -- UIView2

UIScrollView的frame是屏幕的大小,UIView1的frame也是屏幕的大小,但是UIView2的frame是(0,0,768,2000)。

滚动视图不会垂直滚动。根据苹果文档,滚动视图应该自动设置其内容大小。谁能帮我解决这个问题,为什么内容大小设置不正确?

P:S:当我在滚动视图中使用单个视图并设置适当的垂直约束时,它会正确滚动。

【问题讨论】:

  • 如何为每个子视图设置约束?
  • 当您将视图嵌入到 InterfaceBuilder 中的 UIScrollView 中时,会自动设置一个约束。如果您的视图比纵向屏幕“长”,则它根本不会滚动。要让 UIScrollView 进入 AutoLayout,请查看您的约束。找到“垂直空间-滚动视图-视图”并将其从“常量”设置为“自动”
  • 显示你的观点的约束

标签: ios objective-c uiscrollview autolayout xcode5


【解决方案1】:

如果您启用自动布局,Scrollview 将不会滚动。从技术上讲,当您滚动时,滚动视图中的所有元素都会改变它们的位置。因此,如果您要修复滚动视图中元素的位置,请使用自动布局。

改为使用 UIView 作为滚动视图内的容器视图,滚动视图包含所有其他对象,如按钮、标签、图像视图等。然后你就可以滚动了。

查看以下链接了解更多详情: https://developer.apple.com/library/ios/technotes/tn2154/_index.html

在您的问题中尝试设置适当的内容大小值。还要检查是否启用了垂直滚动。

【讨论】:

  • 在滚动视图中放置内容视图是解决方案,但是,什么是多个视图,例如有一个滚动视图,可以说我直接放在滚动视图上的两个标签?我在这里可能完全错了,但必须有比这更好的解决方案。
  • 对此的可能解决方案是将 UIScrollView 与 UIView 作为 containerSubView。比您可以在该 containerSubView 中添加 2 个更多 UIView 或您需要的任何对象。这肯定会奏效。您应该只有一个直接子视图到滚动视图,即 containerSubView 和 DONE :)
  • Chinab,您建议的解决方案是目前正在使用的解决方案。它有效,但我对在这里使用额外的视图持谨慎态度。这是一个非常常见的场景,我们只是在滚动视图上添加一些东西,但我们并不总是添加内容视图。
  • 我已经尝试了您想要实现的目标。我已将 containerView 作为子视图添加到 scrollView。然后在 containerView 我又添加了 2 个 UIView 作为子视图。现在 containerView 的大小应该等于 scrollView 的内容大小。使用自动布局,滚动视图应该只有一个直接子视图,以使事情变得更容易。
  • 我在这里看到了与我想做的类似的事情:link
【解决方案2】:

这个问题很老,但正确的答案是确保所有自动布局约束都已设置。

在垂直方向上,您应该有一些约束将 View1 固定到 Scroll View 顶部,另一个将 View2 固定到 Scroll View 底部,三分之一设置 View1 和 View2 之间的垂直空间。还要检查视图本身(View1 和 View2)是否有高度限制。

水平方向,将其中一个视图固定到滚动视图的前导和尾随空间,将另一个视图左右固定到第一个视图(因此它们将具有相等的宽度)。

所有这些都设置好后,内容应该会正确滚动。

【讨论】:

    【解决方案3】:
    1. 在代码中使用滚动视图的 contentSize 属性。最好的方法是使用 'viewDidLayoutSubviews' 方法

      • (void)viewDidLayoutSubviews { [超级 viewDidLayoutSubviews]; _scrollView.contentSize = CGSizeMake(568, 594); }

    2.始终在最低的内部视图和滚动视图之间留出 >=0 的水平空间。自动布局会自动提出“-160”之类的建议,并且这个负空间不会滚动。

    【讨论】:

    • 第 2 点挽救了我的 4 小时,因为其他答案尝试了近 10 次失败!谢谢
    【解决方案4】:

    如果内容大小大于滚动视图框架,则仅滚动视图滚动,否则不滚动。

    【讨论】:

    • 你不需要设置内容大小,当你使用自动布局时,它会根据scrollView中的视图自动设置内容大小。
    【解决方案5】:

    要点:错误在'UIScrollView'的集合'contentSize',需要手动设置。

    如您的问题所示

    滚动视图框架 = 屏幕框架,
    查看 1 帧 = 屏幕帧,

    没关系,但是

    view 2 frame = (0,0,768,2000), 然后它在第一个视图上重叠,因为您的 view2 x,y 位置是 (0,0),所以您的第一个视图可能不会显示。

    如果你想在视图 2 之后垂直添加视图 1,那么你的视图 2 框架应该是

    view2.frame = CGRectMake(0,view1.frame.origin.y + view1.frame.size.height , 768,2000);
    

    添加两个视图后,您需要管理 contentSizeUIScrollView ,在您的情况下,例如

    scrollView.contentSize = CGSizeMake(768, view1.frame.origin.y + view1.frame.size.height + 2000)
    

    我提出了简单的逻辑,这可能对您的情况有所帮助:

    【讨论】:

    • 是视图的重叠,我有一个功能,我必须隐藏该视图,只需填充一些数据并从中制作一个 pdf。所以这不是问题,而是要求。此外,我尝试在 viewDidload 中设置 contentSize,我知道这不是正确的方法并没有奏效。在 viewDidAppear 中设置 contentSize,同样不是正确的方法,适用于 iOS 6,但不适用于 iOS 7。我确信有一种方法可以根据 scrollView 上的最顶层视图设置自动布局的 contentSize。跨度>
    【解决方案6】:

    如何在与 AutoLayout 一起使用时自动启用 scrollview 滚动:

    请参阅下面的链接以帮助您正确修复它:

    https://medium.com/@pradeep_chauhan/how-to-configure-a-uiscrollview-with-auto-layout-in-interface-builder-218dcb4022d7

    关于上述帮助指南的问题: 哪个视图是父视图? scrollView 还是 scrollView 的父级?

    答案: - ScrollView 的父级(为滚动视图的父级视图赋予等于和等高的高度)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-24
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      相关资源
      最近更新 更多