如何创建一个动态弹出并扩展其超级视图大小的子视图。 (在代码中)

Posted

技术标签:

【中文标题】如何创建一个动态弹出并扩展其超级视图大小的子视图。 (在代码中)【英文标题】:How do I create a SubView that pops up dynamically and expands it's superview size. (in code) 【发布时间】:2017-03-11 04:55:04 【问题描述】:

所以我目前有一个名为“InputView”的UIView 子类,它有两个子视图,一个UILabel 和一个UITextField。我设置它的方式是我可以更改标签和文本字段占位符,以便 InputView 可以用作我的应用程序中任何输入字段(电子邮件、密码等)的模块化组件。我所要做的在我的故事板中创建一个空的UIView,将它的类设置为InputView,其余的以编程方式完成。

现在,我遇到了一个问题。 InputView 是普通的UIView,其约束在情节提要中设置,但我想添加一个子视图(一个表),每当用户编辑UITextField 时动态显示/消失。每次表格出现时,InputView 的高度就会扩大,将其下方的所有内容向下推,然后非常整齐地消失。

我不知道该怎么做。这是我想做的事情:

想法1: 将表格放在视图中,为其添加所有必要的约束,并希望 InputView 自行扩展。 这导致表格在InputView 的框架之外,因此由于某种原因对用户触摸没有响应

想法 2: 更改InputView 的边界并将其高度扩展为表格的高度。 这不起作用,因为约束是在情节提要中设置的,我无法以编程方式访问它们

想法 3: 经过近 5 小时的研究和失败的尝试,请转到 ***,看看是否有人知道如何解决它。 (谢谢!)

【问题讨论】:

【参考方案1】:

您可以进行设置,以便以编程方式更改情节提要约束。

1) 在情节提要中,为 inputView 设置一个高度约束,并将其设置为在表格不可见时有意义的值——可能在 30 左右。(您可能已经这样做了。)

2) 然后通过将该高度约束控制拖动到与其中包含 inputView 的视图控制器相对应的文件,为您的代码创建一个出口。一个对话框将提示您在代码中为插座命名。称它为inputViewHeightConstraint

3) 然后在你的代码中,当你想让你的 inputView 有更大的高度时,将inputViewHeightConstraint.constant 设置为一个新值。请注意,您需要参考 .constant 才能设置约束的新高度。

当您第一次为 inputView 设置高度约束时,请确保将其设为“等于”约束(例如,其高度等于 30)而不是“大于或等于”约束。尽管后者会更有意义,因为您将在代码中将其更改为更大的值,但我发现这种方法存在错误。使它成为一个直接的“等于”约束更干净。

【讨论】:

有效!!对于未来的旅行者,here is a great resource 了解如何对其进行动画处理(因为您为什么要在没有动画的情况下动态更改它?)祝大家好运

以上是关于如何创建一个动态弹出并扩展其超级视图大小的子视图。 (在代码中)的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止从超级视图到子视图的手势?

如何调整超级视图的大小以符合子视图约束

如何使用自动布局动态更改超级视图的高度

使用自动布局扩展方形视图以填充矩形超级视图

使用自动布局动态更改子视图后调整超级视图的大小

从另一个类创建超级视图的子视图不起作用