【问题标题】:Why is a UIScrollView not scrolling vertically (using Auto Layout)?为什么 UIScrollView 不垂直滚动(使用自动布局)?
【发布时间】:2015-10-20 17:22:36
【问题描述】:

我的视图层次结构是

UIView

       UIScrollView

           UIView1

               -->UIView1.1

               -->UILabel

               -->UILabel

               -->UILabel

               -->UILabel  (bottom)

我正在使用自动布局。我已经尝试了所有方法并进行了很多搜索。我确实将底部 UILabel 连接到 UIView1 的底部布局并将其优先级设置为 750(最低的)。我几乎尝试了这个论坛和任何地方所说的一切,因为每个人都在说同样的话。

我还在 UIView1.1 中动态添加一个视图。 我不知道为什么这不起作用。 Scrollview 没有正确滚动。 请帮我。我坚持了3天。

【问题讨论】:

  • 你需要设置内容大小也许这会帮助你自动设置它:CGRect contentRect = CGRectZero; for (UIView *view in self.scrollView.subviews) { contentRect = CGRectUnion(contentRect, view.frame); } self.scrollView.contentSize = contentRect.size;
  • @MrJomp 即使这样也行不通。我正在向 UIView 动态添加一个视图。这有什么不同吗?
  • 也许有时它有助于 NSLog UIViews 的大小和 UIScrollView 的 contentSize 也你检查你是否启用了 UIScrollView 的垂直和水平滚动?如果大小还可以,请尝试检查其他愚蠢的东西,例如“scrollEnabled”和“userInteractionEnabled”。 NSLog是调试这个问题的关键
  • @MrJomp 你是对的。我的内容 size.height 为零。我不知道为什么?它应该从我为标签设置的最后一个约束中获取内容大小到视图。但我得到了零。这就是它不滚动的原因。
  • stackoverflow.com/questions/12846351/… "把UIScrollView里的所有东西放到另一个UIView中,然后把那个UIView作为UIScrollView的唯一孩子,然后就可以使用Auto Layout了。"

标签: ios objective-c uiscrollview autolayout


【解决方案1】:

完成这项工作实际上很容易。您不需要将所有标签放入额外的视图中。而且您不必自己设置contentSize。自动布局将为您做到这一点。

您只需要确保拥有以下物品:

  1. 每个标签和标签顶部的视图必须有一个 设置为滚动视图宽度的 width 约束和值为 0 的 left 约束(或您可能想要添加的任何填充)
  2. 顶部的视图需要一个值为 0 的 top 约束
  3. 底部标签需要值为 0 的 bottom 约束

仅此而已!

这是显示约束的草图:

如果您使用 MasonrySnapKit 进行自动布局,那么这些约束将如何添加到代码中:

topView.snp_makeConstraints { (make) -> Void in
    make.top.equalTo(0)
    make.left.equalTo(0)
    make.width.equalTo(scrollView)
}
label1.snp_makeConstraints { (make) -> Void in
    make.top.equalTo(topView.snp_bottom)
    make.left.equalTo(0)
    make.width.equalTo(scrollView)
}
label2.snp_makeConstraints { (make) -> Void in
   make.top.equalTo(label1.snp_bottom)
   make.left.equalTo(0)
   make.width.equalTo(scrollView)
}
label3.snp_makeConstraints { (make) -> Void in
    make.top.equalTo(label2.snp_bottom)
    make.left.equalTo(0)
    make.width.equalTo(scrollView)
    make.bottom.equalTo(0)
}

【讨论】:

  • 这对我来说非常有效!但是如何为 UIScrollView 添加填充?因为我添加了一个 UITextField 并且看起来很难看,文本字段适合 scrollview.width。
【解决方案2】:
 scrollView.contentSize=CGSizeMake(320,758);
 scrollView.contentInset=UIEdgeInsetsMake(64.0,0.0,44.0,0.0);

最后这几行字救了我。

【讨论】:

  • 很高兴您找到了解决方案。然而,这种解决方案并不理想。由于尺寸固定,这不适用于不同的屏幕尺寸(如 iPhone 5、iPhone 6 和 iPhone 6 Plus)。当标签的文本以及它们的高度发生变化时,它也会中断。请查看我的答案以获得更强大的解决方案。
  • @joern 虽然你可能是对的,但我已经让这些行动态工作了。此外,就我而言,身高不会改变。谢谢您的回答。我也试试这个。
  • 很高兴您的解决方案适合您。但是,如果您使用自动布局,您应该受益于它为您提供的功能。你真的不应该自己计算 contentSize 。偷懒,让自动布局来处理 ;-)
【解决方案3】:

工作试了。

如果您不使用自动布局,那么只需 viewDidLoad():

[_mainScroll setContentSize:CGSizeMake(320, 2000)];

或者如果您使用的是自动布局,请按照以下步骤操作:

首先对滚动视图的顶部、底部、前导和尾随进行约束。现在再看一个视图,并提供与您之前提供的滚动视图相同的约束。

不要忘记为该视图提供额外的约束,固定高度和宽度等于主父视图。

看看这个。

https://www.youtube.com/watch?v=rjTS9fyWqdg

【讨论】:

    猜你喜欢
    • 2018-05-24
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 2013-12-17
    • 2013-08-03
    • 2013-08-23
    相关资源
    最近更新 更多