Я хочу получить следующую структуру программно (и в настоящее время происходит сбой ...):
- Просмотр
- Просмотр прокрутки
- Вертикальный просмотр стека
Мне удалось получить то, что я хотел в Интерфейсном Разработчике, но не могу понять, как этого добиться в коде. В IB это выглядит так (пожалуйста, нажмите на картинку, чтобы увидеть ее полностью):

Настройки стекового вида выглядят так:

Это моя попытка отразить это в коде:
import UIKit
class ScrollViewController: UIViewController {
lazy var scrollView: UIScrollView = {
let s = UIScrollView()
s.contentMode = .scaleToFill
s.backgroundColor = .gray
s.accessibilityIdentifier = "scroll_view"
s.translatesAutoresizingMaskIntoConstraints = false
return s
}()
lazy var stackView: UIStackView = {
let s = UIStackView()
s.axis = .vertical
s.alignment = .fill
s.distribution = .equalSpacing
s.spacing = 10
s.contentMode = .scaleToFill
s.accessibilityIdentifier = "stack_view"
return s
}()
// See helper method at bottom
lazy var textField1 = self.createTextField(placeholder: "Textfield 1")
lazy var textField2 = self.createTextField(placeholder: "Textfield 2")
lazy var textField3 = self.createTextField(placeholder: "Textfield 3")
lazy var textField4 = self.createTextField(placeholder: "Textfield 4")
lazy var textField5 = self.createTextField(placeholder: "Textfield 5")
lazy var textField6 = self.createTextField(placeholder: "Textfield 6")
override func loadView() {
view = UIView()
view.backgroundColor = .white
view.addSubview(scrollView)
scrollView.addSubview(stackView)
stackView.addArrangedSubview(textField1)
stackView.addArrangedSubview(textField2)
stackView.addArrangedSubview(textField3)
stackView.addArrangedSubview(textField4)
stackView.addArrangedSubview(textField5)
stackView.addArrangedSubview(textField6)
NSLayoutConstraint.activate([
scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 20),
scrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -20),
scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -20),
stackView.widthAnchor.constraint(equalTo: scrollView.contentLayoutGuide.widthAnchor),
stackView.trailingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.trailingAnchor),
stackView.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor),
stackView.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor),
stackView.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor)
])
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.contentSize = stackView.frame.size
}
func createTextField(placeholder: String) -> UITextField {
let t = UITextField()
t.translatesAutoresizingMaskIntoConstraints = false
t.borderStyle = .roundedRect
t.clearButtonMode = .whileEditing
t.text = placeholder
t.placeholder = placeholder
t.accessibilityIdentifier = placeholder
return t
}
}
Я явно что-то упускаю, но даже потратив несколько часов на поиски и поиски, я так и не нашел решения ...
Я понимаю, что все текстовые поля и фреймы стекового представления (0, 0, 0 , 0), так что совершенно очевидно, что мне не хватает некоторых ограничений, верно?