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 中使用分页向 UIScrollview 添加子视图
Swift:UIScrollView 不使用 XLPagerTabStrip 显示子视图控制器
以编程方式将 UIScrollView 滚动到 Swift 中的子 UIView(子视图)的顶部