使用自动布局调整超级视图和所有超级视图的兄弟姐妹的大小

Posted

技术标签:

【中文标题】使用自动布局调整超级视图和所有超级视图的兄弟姐妹的大小【英文标题】:Resize superview and all superview's siblings using autolayout 【发布时间】:2014-01-08 15:57:16 【问题描述】:

我正在尝试管理屏幕上的视图,以便所有视图都根据文本视图进行更新,该文本视图根据输入的文本而增长。

在我的控制器视图中,我有两个子视图。我们称它们为 view1 和 view2。 View1 有一个 uitextview 子视图,它根据输入的文本而增长和缩小。

我遇到的问题是 view1 和 view2 在打字时不会增长和缩小。 textView 底部垂直间距的约束常量已设置为距其父视图 10px。 view1 和 view2 之间的垂直间距设置为 0。这是视图的可视化表示:

 ---------------------
|                     |
|  -----------------  |
| |   UITextView    | |
|  -----------------  |
|        view1        |
 ---------------------
|                     |
|                     |
|                     |
|                     |
|        view2        |
|                     |
|                     |
|                     |
|                     |
|                     |
 ---------------------

向 textView 添加文本时得到的结果是:

 ---------------------
|                     |
|  -----------------  |
| |   UITextView    | |
| |                 | |
| |                 | |
 ---------------------
|                     |
|                     |
|                     |
|                     |
|        view2        |
|                     |
|                     |
|                     |
|                     |
|                     |
 ---------------------

但理想的行为应该是这样的:

 ---------------------
|                     |
|  -----------------  |
| |   UITextView    | |
| |                 | |
| |                 | |
| |                 | |
| |                 | |
| |                 | |
|  -----------------  |
|        view1        |
 ---------------------
|                     |
|                     |
|        view2        |
|                     |
|                     |
|                     |
 ---------------------

奇怪的是,一旦我添加了文本并按下了提交(为简单起见,未添加到图表中),view1 会增长到正确的大小,view2 也是如此,但在键入时不会。

我是否需要显式调用 setNeedsUpdateConstraints 或 updateConstraintsIfNeeded?如果有,在哪里?我尝试从文本视图委托 textViewDidChange: 调用它,但没有任何帮助。

任何帮助将不胜感激。

【问题讨论】:

您不需要更新约束,因为它们可能不会改变。对象的大小是,但不是约束对象。当视图的内容发生变化时,尝试调用 setNeedsLayout 和 layoutIfNeeded。 嗨,詹姆斯,感谢您的回复。不,我尝试从 textViewDidChange 回调中调用 [self.view setNeedsLayout] 和 [self.view layoutIfNeeded] 但它似乎不起作用。我也是这么想的。约束不应该改变,而是视图。 textview 和 view1 之间的约束应该“下推”它,而 view1 和 view2 之间的约束应该缩小 view2 的大小.. 会不会是 UITextView 实际上没有增长? UITextView 是 UIScrollView 的子类,因此键入可能不会导致 UITextView 的框架需要更改。它可能只是更新表示该文本的 contentSize 和内部视图。 【参考方案1】:

我设法弄明白了。

对于任何阅读这篇文章的人来说,我这样做的方式是编写我自己的 UITextView 子类,给它一个高度约束和一些委托方法。

当更改文本视图的高度时,只需触发委托方法(例如 textViewDidChangeHeight:)。然后,在委托回调实现中,我只是在视图上调用了 sizeToFit。

【讨论】:

以上是关于使用自动布局调整超级视图和所有超级视图的兄弟姐妹的大小的主要内容,如果未能解决你的问题,请参考以下文章

放置 2 个按钮和 1 个文本字段 - 约束是超级视图而不是兄弟姐妹

根据最大的子视图使用自动布局调整超级视图的大小

根据子视图调整超级视图的大小

根据最高子视图按钮自动调整超级视图高度

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

当兄弟姐妹随自动布局发生变化时,视图不会重绘