К сожалению, вы делаете несколько вещей неправильно.
Во-первых, когда вы используете эту конструкцию:
var scrollView: UIScrollView {
let scroll = UIScrollView()
self.view.addSubview(scroll)
scroll.snp.makeConstraints { (make) in
make.edges.equalTo(self.view)
}
return scroll
}
Каждый раз вы ссылаетесь на scrollView
вы создаете другой экземпляр представления прокрутки.Запустив ваш код и используя Debug View Hierarchy, вы получите следующее:
Представления red
- это scrollViews и представления blue
являются contentViews.Как видите, это определенно не , что вы хотите.
Вот пример того, как вы можете делать то, что вы пытаетесь сделать:
class ViewController: UIViewController {
var scrollView: UIScrollView = {
let scroll = UIScrollView()
scroll.backgroundColor = .red
return scroll
}()
var contentView: UIView = {
let content = UIView()
content.backgroundColor = .blue
return content
}()
var chart: UILabel = {
let v = UILabel()
v.numberOfLines = 0
v.text = "This is the\nChart View"
v.backgroundColor = .cyan
v.textAlignment = .center
return v
}()
var bottomLabel: UILabel = {
let v = UILabel()
v.text = "The Bottom Label"
v.backgroundColor = .yellow
v.textAlignment = .center
return v
}()
override func viewDidLoad() {
super.viewDidLoad()
// add scrollView
self.view.addSubview(scrollView)
// constrain to safe area (so it doesn't extend below the tab bar)
scrollView.snp.makeConstraints { (make) in
make.edges.equalTo(self.view.safeAreaLayoutGuide)
}
// add contentView to scrollView
self.scrollView.addSubview(contentView)
// constrain all 4 edges to scrollView
// this will allow auto-layout to control / define the .contentSize
contentView.snp.makeConstraints { (make) in
make.edges.equalTo(self.scrollView)
}
// constrain contentView's width to scrollView's width
// but we *don't* constrain its height
contentView.snp.makeConstraints { (make) in
make.width.equalTo(self.scrollView)
}
// add the chart to contentView
self.contentView.addSubview(self.chart)
// constrain chart to top, left and right of contentView
// constrain its height to scrollView's height (so it initially fills the visible area
chart.snp.makeConstraints { (make) in
make.top.equalTo(self.contentView)
make.left.right.equalTo(self.contentView)
make.height.equalTo(self.scrollView)
}
// now, we'll add a label to scrollView
self.contentView.addSubview(self.bottomLabel)
// constrain the label left and right with 20-pts, and a height of 40
bottomLabel.snp.makeConstraints { (make) in
make.left.equalTo(self.contentView).offset(20)
make.right.equalTo(self.contentView).offset(-20)
make.height.equalTo(40)
}
// constrain the label's TOP 20-pts below the BOTTOM of chart view
bottomLabel.snp.makeConstraints { (make) in
make.top.equalTo(self.chart.snp.bottom).offset(20)
}
// constrain the BOTTOM of the label 20-pts from the bottom of contentView
bottomLabel.snp.makeConstraints { (make) in
make.bottom.equalTo(self.contentView).offset(-20)
}
// with those constraints, contentView's height is now:
// chart's height + 20 + label's height + 20
// and because contentView's bottom is constrained to scrollView's bottom,
// that becomes scrollView's contentSize
}
}
Я добавил UILabel
в качестве вида chart
и еще одну метку под ним, чтобы показать, как использовать автоматическую разметку для определения содержимого прокрутки.
Исходное представление:
Прокрутка вверх:
и результирующая иерархия просмотра:
Комментарии, которые я включил в код, должны прояснить, как и почему это делается таким образом.