如何在 StackView 中展开 UITableView?

Posted

技术标签:

【中文标题】如何在 StackView 中展开 UITableView?【英文标题】:How to expand a UITableView inside a StackView? 【发布时间】:2020-04-11 17:10:31 【问题描述】:

我以编程方式创建了 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】:

UITableView 没有固有的高度/宽度,因此当放置在没有任何高度/宽度信息的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。


(额外)游乐场示例:

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查看区别

【讨论】:

以上是关于如何在 StackView 中展开 UITableView?的主要内容,如果未能解决你的问题,请参考以下文章

如何在代码中使用 UItable 单元中的按钮插座

Swift:如何在垂直stackview中水平居中元素

如何在 ScrollView 中布局 2 个不同大小的 StackView

如何在水平stackview中居中按钮?

如何将文本包装在 Iphone 的 UITable 单元格中?

如何在 StackView 中设置等宽或等高?