【问题标题】:dynamic height of of scrollview subviews in autolayout ios自动布局ios中滚动视图子视图的动态高度
【发布时间】:2016-11-03 10:29:26
【问题描述】:

我正在从 xib 创建一个 UIScrollView,其中 3 个视图有 2 个 UIView,中间有一个 UIImageView。当我设置约束时,Xcode 要求设置 Y 位置约束。但问题是 Y 位置约束阻止 Scrollview 向下滚动并自动调整在横向模式下看起来很难看的视图。

当我删除该约束时,它要求修复子视图的高度。我搜索了很多,但我是自动布局的新手,所以不了解很多解决方案。任何帮助都会很棒。

【问题讨论】:

  • 你考虑过使用tableView吗?
  • 你给 UIImageview 做了高度限制吗?
  • @Adeel 我想在这里使用滚动视图。
  • @KKRocks 我想要图像视图中的动态高度,这意味着顶部和底部视图将粘在顶部和底部屏幕上,而图像视图将占用所有其他剩余空间。像android中的layout_weight属性
  • 你能简单解释一下你的视图控制器和滚动视图的场景和视图层次吗?

标签: ios uiscrollview autolayout constraints subview


【解决方案1】:

您必须在内容视图中设置所有高度限制。 但您也希望 Content 的高度与屏幕尺寸成正比。

为此,将图像视图 [equal|proportional|a-computation-of] 的高度约束分配给包含 UISCrollView 的视图。

在两个视图之间分配约束时跳过层次结构似乎很奇怪,这两个视图不是彼此的直接祖先/兄弟但在滚动视图中(至少)这是完全可以接受的。

您基本上是在告诉滚动视图它的内容具有已知大小,同时设置此内容以动态地适应屏幕大小(如果根 uiview 的约束设置正确)

UIView1
|---UIScrollView
    |---UIView2
    |---UIImageView [heightConstr.constant=UIView1.height-UIView2.height-UIView3.height-margins]
    |---UIView3

这是基本思想,以编程方式完成,然后您可以探索其他解决方案。

不幸的是,当涉及更复杂的方程式时,iOS 中的约束系统非常糟糕,涉及单个约束的更多视图。

【讨论】:

  • +1 用于解释 ios 约束的复杂性,但它不能解决我的问题,所以不能给你正确的标记。
  • 实际上我的viewcontroller 包含scrollview 可能是这个问题
  • 你的视图控制器还有一个根 UIView 没有?
【解决方案2】:

UIScrollView在添加约束时可能会很棘手。您应该始终添加一个subView,它将作为您的UIScrollView 的内容视图,并且您的所有后续视图都将进入此内容视图。

UIView1
|---UIScrollView
    |---UIContentView
        |---UIView2
        |---UIImageView

像往常一样设置你的UIScrollViewconstraints,但将你的内容视图设置为UIScrollView的前导、尾随、顶部和底部,但还要添加两个相同的宽度和高度的约束到@987654329 @ 但将具有 low 优先级(因此,无论您的内容向哪个方向增加,该约束都会中断并通过获取内容视图的推断高度来自动增加滚动视图的内容大小) .现在继续像往常一样在所有subview 上添加约束。我假设是:

  1. 您的最顶层视图将具有顶部、前导和尾随到其superView 以及固定高度。
  2. 您的底视图将在其superView 处具有前导、尾随和底部,并且还有一个固定高度。
  3. 您的UIImageView 将有一个前导、尾随和从上到下的最视图以及从下到下的视图。

编辑: 这是屏幕截图以防万一(在检查器中显示带有内容视图约束的视图层次结构)

【讨论】:

  • 这不会给 UIView 带来缺失的约束吗? conentView 和 imageView 将相互需要彼此的高度来计算自己的高度。
  • 由于顶部和底部视图已附加并具有固定高度,因此剩余的空间将使用UIImageView 进行调整。由于内容视图的高度与整个视图相等,因此它将具有内容视图所需的所有约束,并在需要时打破等高。如果 OP 希望至少完全显示特定的高度或图像,他将不得不对 UIImageView 进行高度限制,并以编程方式使用图像的高度对其进行更新。
  • 要更改我在上一条评论中的声明,>= 的约束也将确保最小 height 其余部分将在基础上计算出来手机大小。
  • 如果它有效,那肯定是比我的更干净的解决方案。
最近更新 更多