iOS - 使用滚动视图的奇怪约束

Posted

技术标签:

【中文标题】iOS - 使用滚动视图的奇怪约束【英文标题】:iOS - wierd constraints using scrollview 【发布时间】:2017-02-27 14:47:03 【问题描述】:

当我使用 scrollView 时,我的行为很奇怪。 正如您在下图中看到的,名为“Back”的按钮有一个值为 0 的底部空间约束。但我们可以看到它甚至不靠近滚动视图的底部。 我已经将滚动视图设置为具有等于 superView 的宽度和高度以及顶部、底部、尾随和前导空间的 0 值。

我该如何解决这个问题?我希望后退按钮仍在滚动视图内并将其放在视图的底部。

更新

我这里有代码https://github.com/rchampa/NDParallaxIntroView,xib 叫做 PageB.xib

【问题讨论】:

从验证代码中移除顶部约束。 我已经更新了这个问题,因为“后退按钮”也发生了同样的情况 OK 然后从滚动视图中删除高度约束,因为滚动视图从其子视图中获取高度。 但是,滚动视图有很多子视图,而不仅仅是一个。你可以在图片上看到它。 查看下方:***.com/questions/16825189/… 【参考方案1】:

Ricardo:您添加了两个关于管理 Validate Code 按钮的 y 位置的约束,您的顶部约束停止以将 Validate Code 按钮移向底部。所以请去掉验证代码的顶部约束,只添加底部约束。

您需要管理所有约束,例如您的滚动视图内容视图高度将等于高度。请从顶部增加一些顶部约束。

【讨论】:

您说的是“发送电子邮件”按钮吗?此按钮与“验证代码”相关。我会更新这个问题,因为这也发生在后退按钮上。 实际上发生这种情况是因为滚动视图占用了它的内容大小。所以返回按钮来自滚动视图内容大小的底部。为了管理这一点,您需要注意从上到下的所有 UIControls 约束,这将增加滚动视图的内容大小。 你是说我必须在运行时将滚动视图的顶部和底部空间的约束更新为0? 不,请增加发送电子邮件验证按钮的上边距,您会看到底部控制器将移动到底部,因为滚动视图内容大小会增加。 某些约束不满足滚动视图内容大小等于滚动视图实际高度。请检查我的更新答案。【参考方案2】:

所以,如果我理解正确,您遇到的问题是您的后退按钮无法根据滚动视图的底部定位。

一个滚动在情节提要中有两组约束,一组定义滚动视图的大小,另一组定义内容大小。滚动视图上的上、左、下、右约束将定义大小。

导致您的问题的部分是内容大小由滚动视图内的子视图定义。所以按钮不能相对于滚动视图的底部放置,因为滚动视图不知道它的内容大小有多大。滚动视图的所有子视图必须相互关联。

因此,为您的徽标、文本字段和所有相互关联的按钮创建约束。然后创建从最外层子视图到滚动视图的约束。

在您的示例中,您将约束从徽标到文本字段,第一个文本字段到第二个文本字段,然后第二个文本飞到标签,标签到“发送电子邮件...”按钮,最后是“发送电子邮件...”到“验证代码”。对于“返回”按钮,它需要与文本字段左对齐,然后与“验证代码”按钮居中对齐。创建从徽标到滚动视图的顶部约束。然后有从文本字段之一到滚动视图的前导和尾随约束。最后,创建一个从“Back”或“Validate Code”按钮到滚动视图的底部约束。您还需要一些对齐约束(文本字段的徽标中心就是一个示例)。完成所有设置后,您的视图将根据滚动视图的内容大小完全定义。

如果我理解你,我的新问题是:如何制作子视图 使滚动高度适合 100% 屏幕设备高度?有没有 像android这样定义权重的方法?我不知道如何实现这一点 因为画布是 600*600,每个设备都不同。

回复太长,无法发表评论:

所以你不会为此使用滚动视图。滚动视图专门用于包含不适合屏幕的内容(因此用户可以滚动以到达新内容)。

最简单的解决方案是添加一个具有 TopLeftBottomRight 0 距离约束的常规视图(因此它是屏幕的最大高度和宽度)并像您在此处一样设置视图以始终将底部定位在左下角.

还有一个重量系统,如果你愿意,我可以解释,但目前不需要。

我觉得您的下一个回复将是“如果我希望它在当前屏幕太小时滚动怎么办?”。我知道这样做的唯一方法是将所有界面封装到单个 UIView 中,并根据滚动视图的大小在 viewDidLoad/viewDidAppear 中更改其大小。像这样的:

func viewDidLoad() 
    super.viewDidLoad()
    containerViewHeightConstraint.constant = scrollView.frame.size.height
    containerViewWidthConstraint.constant = scrollView.frame.size.width

【讨论】:

如果我理解你,我的新问题是:如何使子视图使滚动高度适合 100% 屏幕设备高度?有没有办法像Android一样定义权重?我不知道如何实现这一点,因为画布是 600*600,每个设备都不同。

以上是关于iOS - 使用滚动视图的奇怪约束的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 滚动视图和相等宽度不起作用

应使用哪些滚动视图和图像视图设置在 iOS 中显示可缩放图片?

带有约束的滚动视图中的iOS Swift stackview

滚动视图内的约束

Xamarin iOS:滚动视图中的自动布局?

iOS 11:带有不透明导航栏的导航控制器内带有滚动视图的弹出视图控制器在转换期间导致奇怪的内容动画