我正在处理这个编程创建的滚动视图和堆栈视图的示例,我决定尝试并将Uibuttons更改为Uilabels。我用此代码替换了for循环内部的代码:
let label = UILabel()
label.text = "Label"
stackView.addArrangedSubview(label)
当我重新运行应用程序时,我发现滚动视图不再可以滚动。调试后,我发现堆栈视图的frame
的宽度为零,高度为零,我认为这是问题的根源。我一直无法弄清楚为什么堆栈视图没有宽度或高度或如何使滚动视图再次滚动。
这是完整的视图控制器,我的修改将其编译为Swift 4,使用Uilabel并打印框架大小:
import UIKit
class ViewController: UIViewController {
var scrollView: UIScrollView!
var stackView: UIStackView!
override func viewDidLoad() {
super.viewDidLoad()
scrollView = UIScrollView()
scrollView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(scrollView)
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[scrollView]|", options: .alignAllCenterX, metrics: nil, views: ["scrollView": scrollView]))
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[scrollView]|", options: .alignAllCenterX, metrics: nil, views: ["scrollView": scrollView]))
stackView = UIStackView()
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.axis = .vertical
scrollView.addSubview(stackView)
scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView]))
scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[stackView]", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView]))
for _ in 1 ..< 100 {
let label = UILabel()
label.text = "Label"
label.sizeToFit()
stackView.addArrangedSubview(label)
// let vw = UIButton(type: UIButtonType.system)
// vw.setTitle("Button", for: .normal)
// stackView.addArrangedSubview(vw)
}
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.contentSize = CGSize(width: stackView.frame.width, height: stackView.frame.height)
print("stack view frame: (stackView.frame)")
}
}
您应该:
•通过更新您的最后一个VFL约束,将stackView
的底部固定到scrollView
的内容底部边缘:
scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView]))
•避免将AutoLayout与"手动"布局混合并删除该行:
scrollView.contentSize = CGSize(width: stackView.frame.width, height: stackView.frame.height)