Я возился с этим примером программно созданного представления прокрутки и представления стека, и я решил поэкспериментировать и изменить 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)")
}
}