Swift:UIScrollView无法垂直滚动

3
我看过这篇文章: scrollView not scrolling swift,发现被采纳的答案建议在UIScrollViews子视图contentView上添加底部约束。我有以下视图层次结构和每个视图上的约束:

UIView -> UIScrollView(scrollView) -> UIView(contentView)

//in the View Controller
self.view.addSubview(coverImage)
scrollView.addSubview(contentView)
view.addSubview(scrollView)

这里是我添加到 scrollViewcontentViewNSLayoutConstraint

let tmpViewsDictionary = ["scrollView":self.scrollView, "contentView": self.contentView]

 self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[scrollView]-0-|",options: [], metrics: nil,views: tmpViewsDictionary))

self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[scrollView]-0-|",options: [], metrics: nil, views: tmpViewsDictionary))

self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[contentView]-0-|",  options: [], metrics: nil, views: tmpViewsDictionary))

 self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[contentView]-0-|", options: [],  metrics: nil, views: tmpViewsDictionary))

self.view.addConstraints([NSLayoutConstraint(item :self.contentView, attribute: .Width,  relatedBy: .Equal,  toItem: self.view, attribute: .Width , multiplier: 1,  constant: 0)])

我正在遵循这个教程的一般结构,它固定了scrollView的宽度并具有灵活的高度。

http://nscookbook.com/2015/06/ios-programming-recipe-36-a-fixed-width-dynamic-height-scrollview-in-autolayout/

当我添加的内容超过实际父视图大小时,我无法向下滚动以查看其余部分。 似乎他们如何使高度动态而宽度固定是通过将UIScrollView的子视图约束为与UIScrollView的父视图具有相等的宽度。我成功地做到了这一点,但滚动仍然没有发生。谢谢您的帮助!
这是此视图的完整ViewController

https://gist.github.com/ebbnormal/90c35c435320e0ec1307e95f575119bf

更新

我采用了Daniel的建议,将contentView底部的锚定点从scrollView底部移除。

所以在调试视图层次结构后,我发现contentView被设置为小于其父视图高度,这似乎源自一个自动布局约束,将contentViewself.bottom设置为UILabellabel.bottom,而该UILabelcontentView的子视图。我从未设置过这个约束,也不知道如何去除它。

以下是在ViewHierarchy中的样子,其中突出显示的View是被裁剪的contentView

enter image description here

2个回答

2
你添加约束的方式很可能是问题的原因。
看起来你正在将内容视图的边界约束为与滚动视图相同。在这种情况下,由于约束的存在,无法进行滚动。
这是由于你在tmpViewsDictionary中包含了self.scrollViewself.contentView
在你提供的教程中,该字典仅用于对滚动视图内容视图中的视图添加约束。它不包括滚动视图或内容视图。

那么我应该移除contentView的底部约束,这样它就不再与scrollView的父视图相连了吗? - Thalatta
是的。您需要消除将“contentView”的底部固定在“scrollView”的底部的约束条件。 - Daniel Zhang
请查看我创建的 GitHub 链接,以获取整个 ViewController 文件。 - Thalatta
1
你可以通过打印每个视图的框架来调试此问题。这将帮助你缩小约束被解释的方式的范围。 - Daniel Zhang
1
也许可以删除以 self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[scrollView]-0-| 开头的那一行代码。我猜你有一些理由通过编程方式添加约束,而不是使用 Interface Builder 进行布局。在我看来,使用 IB 进行布局会更加容易。我现在得走了,但希望你能解决这个问题。 - Daniel Zhang
显示剩余5条评论

1
我犯了一个愚蠢的错误,设置了contentView的子视图的垂直约束并将其固定在contentView底部,这就是为什么contentView被截断且无法滚动的原因。
"V:|-300-[wikiTitle]|"

最后一个 "|" 剪断了我 UIScrollView 的子视图。
最后,我需要将 contentView 的最后一个项目固定在距离 contentView 底部特定的间距处。

1
太好了!很高兴你让它滚动并确定了确切的问题。 - Daniel Zhang
这真的救了我的命。事实上,如果没有设置约束来指示以下两点,即:1) contentView 如何连接到 scrollView 的顶部和底部边缘;以及 2) contentView 的任何子视图如何连接到 contentView 的顶部和底部边缘,则 UIScrollView 无法垂直滚动。 - Jamie Birch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接