UITableView
не имеет встроенной c высоты / ширины, поэтому при размещении в UIStackView
без какой-либо информации о высоте / ширине ему будет предоставлен размер по умолчанию. т.е. если ваш самый высокий вид в стеке имеет высоту 60, то tableView
также будет равен 60.
Вы можете изменить это, задав yearTable
ограничение высоты перед добавлением его в UIStackView
, вот так:
func fillStackView() {
//...
yearTable.translatesAutoresizingMaskIntoConstraints = false
yearTable.heightAnchor.constraint(equalToConstant: 150).isActive = true
allViews.append(yearTable)
//...
}
Но учтите, что если вы сделаете это, то из-за stackView.distribution = .fillEqually
все ваши другие представления в UIStackView
также станут 150.
(EXTRA) Playground Пример:
import UIKit
import PlaygroundSupport
class ViewController: UIViewController {
lazy var stackView: UIStackView = {
let stackView = UIStackView()
stackView.axis = .vertical
stackView.distribution = .fillEqually
stackView.spacing = 8
stackView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(stackView)
stackView.widthAnchor.constraint(equalToConstant: 200).isActive = true
return stackView
}()
let datasource = [1,2,3,4,5,6,7,8,9,10]
override func viewDidLoad() {
super.viewDidLoad()
appendLabel(text: "Hello, World!", color: .lightGray)
appendLabel(text: "Lorem\nipsum\ndolor\nsit", color: .gray)
appendTableView()
}
func appendLabel(text: String, color: UIColor) {
let label = UILabel()
label.backgroundColor = color
label.numberOfLines = 0
label.text = text
stackView.addArrangedSubview(label)
}
func appendTableView() {
let tableView = UITableView()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
tableView.dataSource = self
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.heightAnchor.constraint(equalToConstant: 150).isActive = true
stackView.addArrangedSubview(tableView)
}
}
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return datasource.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let item = datasource[indexPath.row]
cell.textLabel?.text = String(item)
return cell
}
}
let vc = ViewController()
vc.view.frame = CGRect(x: 0, y: 0, width: 320, height: 480)
PlaygroundPage.current.setLiveView(vc.view)
- Комментарий
tableView.heightAnchor.constraint(equalToConstant: 150).isActive = true
, чтобы увидеть разницу