UIScrollView 动态高度内容(自动布局)没有填满整个空间

Posted

技术标签:

【中文标题】UIScrollView 动态高度内容(自动布局)没有填满整个空间【英文标题】:UIScrollView dynamic height content (autolayout) not filling whole space 【发布时间】:2016-02-22 22:07:54 【问题描述】:

我正在创建一个小型聊天应用程序,在其中我使用 UIScrollView 的自定义子类来呈现消息。这个应用程序只是为了练习,所以我不想使用第三方库。在阅读了 Apple 的 technical note 2154 和几个解释这一点的教程之后,我正在通过自动布局实现这个 UIScrollView,我的实现几乎可以工作,但我的 UIScrollView 的内容视图似乎并没有填满所有可用的空间。

显示 ScrollView 的代码是:

public class ChatView: UIScrollView 
    private var contentView: UIView

    ...

    // This get called by all the init methods. contentView is already created ( contentView = UIView() )
    private func setupViews() 
        self.translatesAutoresizingMaskIntoConstraints = false
        contentView.translatesAutoresizingMaskIntoConstraints = false

        self.addSubview(contentView)

        let constraint1 = NSLayoutConstraint(item: self, attribute: .Top, relatedBy: .Equal, toItem: contentView, attribute: .Top, multiplier: 1.0, constant: 0.0)
        let constraint2 = NSLayoutConstraint(item: self, attribute: .Bottom, relatedBy: .Equal, toItem: contentView, attribute: .Bottom, multiplier: 1.0, constant: 0.0)
        let constraint3 = NSLayoutConstraint(item: self, attribute: .Width, relatedBy: .Equal, toItem: contentView, attribute: .Width, multiplier: 1.0, constant: 0.0)
        let constraint4 = NSLayoutConstraint(item: self, attribute: .CenterX, relatedBy: .Equal, toItem: contentView, attribute: .CenterX, multiplier: 1.0, constant: 0.0)

        self.addConstraints([constraint1, constraint2, constraint3, constraint4])

        self.layoutIfNeeded()

        // Later, the messages are added to the contentView. I don't think is relevant to see the exact code (but I can post it if needed)
        // Each message is added using autolayout and the constraints only reference the messages themselves and contentView
    

当我将 ChatView 添加到我的视图控制器(使用情节提要)时,它的四个侧面固定到不在他的层次结构中的视图,会发生以下问题:

在图片中,scrollView 不能再向上滚动了。似乎有一个空间应该被填充而没有。如果我向下滚动,我会遇到完全相同的问题,但空白区域位于内容下方。在下图中,您可以看到 contentView 比 ChatView 本身最小:

和相同的视图层次结构,但显示的约束:

在这两个图像中,背景中的视图是 ChatView,而选定的视图是 contentView。我无法弄清楚为什么内容视图没有覆盖整个 ChatView 空间。

提前致谢!

【问题讨论】:

【参考方案1】:

在another *** question 中搜索另一个问题时,我终于偶然发现了答案。关键是打开storyboard,在容器视图控制器中设置“AdjustsScrollViewInsets”为“NO”。

在代码中它很简单(在视图控制器内部):

self.automaticallyAdjustsScrollViewInsets = NO;

【讨论】:

以上是关于UIScrollView 动态高度内容(自动布局)没有填满整个空间的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局向 UIScrollView 添加动态大小的视图(高度)

包含动态 TableView 高度的 UIScrollView 的自动布局

如何使用情节提要和自动布局在 UIScrollView 中添加动态高度/空间元素? [复制]

将动态高度设置为 UIScrollView Swift

在自动布局中动态更改 UIScrollView 的大小

如何使用自动布局在 UIScrollView 中为视图高度设置动画?