使用自动布局问题在 UIScrollView 中调整 UITextView 的大小

Posted

技术标签:

【中文标题】使用自动布局问题在 UIScrollView 中调整 UITextView 的大小【英文标题】:Resizing a UITextView in UIScrollView using Auto Layout issue 【发布时间】:2013-07-29 10:32:11 【问题描述】:

我真的不想在这里问,因为我通常会尝试自己解决问题。但在这个问题上,我已经坚持了好几天,在网上的任何地方都找不到解决方案。

我有一个包含多个子视图的 ScrollView。我在顶部有一个图像视图和两个固定高度的标签。然后是一个 UITextView 和另一个 ImageView(见图)。

我以编程方式将文本添加到文本视图中,因此它应该具有动态高度,并且 ImageView 应该移动到底部以便您可以滚动。我不希望 TextView 本身可以滚动,但我希望所有子视图也可以移动。

我知道我应该能够使用约束来解决这个问题。但我觉得我已经尝试了一切,但没有任何效果。当我禁用自动布局并手动移动视图时,它起作用了。不过我想知道是否有更好的方法。

如您所见,我将 TextView 以 1,000 的优先级固定到上面的 ImageView 上,并以 1,000 的优先级固定到下面的 ImageView 上。高度约束无法删除,所以我将其设置为可能的最低优先级。底部的 ImageView 以绝对高度固定到 superview 的底部。它的高度约束也具有低优先级。 (如果有帮助,我可以发布 ImageView 约束的图像) 我还尝试以编程方式调整框架,但这与自动布局结合使用效果不佳。 (如果有帮助,我当然可以发布代码)

我做错了什么?我应该禁用自动布局并手动执行吗?这对我来说似乎不干净。有可能吗?

非常感谢您的帮助 :) 问候, 一月

【问题讨论】:

我今天一直在努力解决同样的问题。我的解决方案是放弃UIScrollView 并改用UITableView。然后将单个UIView拖入UITableView,从而创建一个表头。 UIView 是表头的容器,不需要任何约束,并且子项可以使它们的约束相对于表头。我确定这是一个 hack,但至少它有效。 【参考方案1】:

确保在 Interface Builder 中未选中 UITextView 上的 Scrolling Enabled 属性。我相信自动布局系统在计算内在内容大小时会考虑到这一点。

【讨论】:

【参考方案2】:

如果有人遇到类似的问题:这就是我最终要做的:

从 IB 的 ScrollView 中移除所有子视图 以编程方式将单个 UIView 添加到 ScrollView。 将所有视图作为子视图添加到 UIView(使用 setFrame 移动它们) 将 UIView 的 Frame 适当地设置为子视图 将 ScrollView 的 contentSize 设置为 UIView 的大小。

还有一点工作,但它终于奏效了。这遵循 Apple 的混合方法指南,可在此处查看(查找 UIScrollView):http://developer.apple.com/library/ios/#releasenotes/General/RN-iOSSDK-6_0/index.html

【讨论】:

【参考方案3】:

问题在于高度设置。您必须以某种方式尝试删除它。如果您添加了其他“足够”的约束,它应该可以删除。

目前,您有一个“大于或等于”高度的用户约束和一个“等于”约束。显然,这些都不能很好地协同工作。

也许还有一个概念错误。下部图像视图不应固定在位置上,因此与下部图像视图的距离将不是“足够”的约束,无法让您删除固定高度。

我认为如果

下部图像视图具有固定高度和 到上面的文本视图的固定距离,并且 文本视图具有最小高度以及 到上方图像视图的固定距离 (应该与超级视图相关)。

【讨论】:

感谢您的回答。问题是,每次我将第二个高度约束更改为“大于或等于”时都会再次添加第二个高度约束,因此我有两个约束。较低的 ImageView 具有: - 到 TextView 的固定距离 - 固定高度 - 到滚动视图底部的固定边距。我认为你所有的点都已经实现了,除了高度限制不能删除。我不明白为什么。这是 ImageView 约束的图像:pl.vc/18oiq 您的图像视图底部空间到superview 是固定的。是否正确调整了超级视图的大小?如果不是,这将阻止文本视图的大小。另外,请检查this。 这正是重点。超级视图是一个滚动视图,因此可能需要更改 contentSize 属性。我该怎么做呢?仅以编程方式还是有办法让 IB 处理这个问题?感谢您的帮助! 在我看来,它必须以编程方式进行。您正在动态更改文本视图中的文本 - 调整大小也必须在代码中进行管理。 我只是将滚动视图和文本视图的内容高度设置为 8000,然后我尝试编辑 textView 的框架,在我看来 [postTextView setFrame:textViewFrame] 由于自动布局而无法正常工作。那可能吗?还没有解决问题。

以上是关于使用自动布局问题在 UIScrollView 中调整 UITextView 的大小的主要内容,如果未能解决你的问题,请参考以下文章

通过 UIScrollView 使用代码中的自动布局

使用自动布局获取 uiscrollview 的高度

在 UIScrollView 子视图中使用自动布局(以编程方式)

使用自动布局约束在 UIScrollView 内为 UIView 设置动画

使用自动布局在 UIScrollView 中使用浮动视图滚动犹豫

UIScrollView setContentSize 使用自动布局打破视图