Swift 向 UIScrollView 子视图添加约束

Posted

技术标签:

【中文标题】Swift 向 UIScrollView 子视图添加约束【英文标题】:Swift add constraints to UIScrollView subviews 【发布时间】:2016-10-15 04:07:47 【问题描述】:

我是使用子视图的新手,但由于某种原因向scrollView 添加约束不显示子视图。它仅在使用.frame 时有效。请查看我的代码并告诉我。谢谢。

let scrollView = UIScrollView()
let myView = UIImageView()

override func viewDidLoad() 

    view.addSubview(scrollView)
    scrollView.backgroundColor = .red
    scrollView.translatesAutoresizingMaskIntoConstraints = false
    scrollView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
    scrollView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0).isActive = true
    scrollView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true

    scrollView.addSubview(myView)
    myView.backgroundColor = .brown
    myView.translatesAutoresizingMaskIntoConstraints = false
    myView.leftAnchor.constraint(equalTo: scrollView.leftAnchor, constant: 0).isActive = true
    myView.rightAnchor.constraint(equalTo: scrollView.rightAnchor, constant: 0).isActive = true
    myView.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 0).isActive = true
    myView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: 0).isActive = true

【问题讨论】:

如果您将UIImageView 更改为普通的UIView,它会显示吗? 所有视图的行为都相同。解决方法是在 scrollView 内设置顶部锚点,并在 view 上设置左、右锚点,这很奇怪,它的行为方式或为什么应该如此,但苹果再次推出了太多有问题的应用程序。 【参考方案1】:

这是因为在使用自动布局时UIScrollView 的大小与其父级和子级的关系有关。

您拥有的第一组约束(在滚动视图与其父视图之间)确保滚动视图的框架固定到根视图的边缘。

第二组约束(在滚动视图和它的子视图之间)只是确保滚动视图的内容大小等于子视图的大小。本质上,这个约束最终会修改滚动视图的内容大小,而不是子视图的框架。子视图为空白且没有内容,因此其大小为 0。这使得滚动视图的内容大小为 0。

print(scrollView.frame)
(0.0, 0.0, 414.0, 736.0)
print(scrollView.bounds)
(0.0, 0.0, 414.0, 736.0)
print(scrollView.contentSize)
(0.0, 0.0)
print(myView.frame)
(0.0, 0.0, 0.0, 0.0)

technical note 对此行为进行了一些解释。

如果您真正想要的是让子视图填充滚动视图的整个框架,您可以明确地做到这一点:

myView.heightAnchor.constraint(equalTo: scrollView.heightAnchor).isActive = true
myView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

【讨论】:

以上是关于Swift 向 UIScrollView 子视图添加约束的主要内容,如果未能解决你的问题,请参考以下文章

如何向子视图属性 Swift 添加操作? [复制]

在 Swift 中使用分页向 UIScrollview 添加子视图

Swift:UIScrollView 不使用 XLPagerTabStrip 显示子视图控制器

以编程方式将 UIScrollView 滚动到 Swift 中的子 UIView(子视图)的顶部

无法设置 UIView 的 backgroundColor,它是 Swift 中 UIScrollView 的子视图

swift 以编程方式将UIScrollView滚动到Swift中的子UIView(子视图)的顶部