Как расширить UITableView внутри StackView? - PullRequest
0 голосов
/ 11 апреля 2020

Я программно создал Stackview вместе с UITableView внутри него.

func setupStack() {
        view.addSubview(stackView)
        stackView.axis = .vertical
        stackView.distribution = .fillEqually
        stackView.spacing = 8
}

func fillStackView() {
yearTable.isHidden = true
        yearTable.layer.cornerRadius = 10
        allViews.append(yearTable) // adding the view to an array of views
// other views also created and added to stack

}

Моя проблема в том, что когда я исчезаю в tableView, он занимает столько же места, сколько и другие представления в таблице, которые все они имеют высоту 40. TableView имеет высоту 150, но он никогда не расширяется до этой высоты. Как мне заставить его расширяться?

1 Ответ

0 голосов
/ 11 апреля 2020

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, чтобы увидеть разницу
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...