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 的自动布局