展开UITableView以显示堆栈视图中的所有单元格?

我无法让我的UITableView在我的堆栈视图中显示全高。

我的视图树如下所示:

- View - Scroll View - Stack View - Table View - Image View - Map View 

表视图dynamic填充数据,工作正常。 问题是一次只能看到一行,我必须滚动列表。 我希望看到的是,桌面视图需要尽可能多的垂直空间,因为它需要显示所有的单元格。

我曾尝试调整桌子的高度如下,但只是结束了不再滚动的桌子,虽然即使它工作,我宁愿有更多的dynamic:

 override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) self.detailsTableView.frame.size.height = 200 } 

我怀疑这可能是需要调整的“堆栈视图”的一个方面,但我现在还不确定。 任何人都可以提出一个合适的方式

一个UIStackView将压缩视图,只要它可以抵消这个设置一个高度锚点和宽度锚点的UITableView或其高度和宽度的优先级。 下面是我们如何在堆栈视图中负责表的维度的一个工作示例。

实例化和集中定位UIStackView的扩展

首先我写了一个UIStackView扩展,以便我不需要在视图控制器中包含所有的代码。 你的定位和设置会有所不同,因为你把你的堆栈视图放在一个滚动视图中,但是把这个代码分开意味着你可以做出自己的调整。

 extension UIStackView { convenience init(axis:UILayoutConstraintAxis, spacing:CGFloat) { self.init() self.axis = axis self.spacing = spacing self.translatesAutoresizingMaskIntoConstraints = false } func anchorStackView(toView view:UIView, anchorX:NSLayoutXAxisAnchor, equalAnchorX:NSLayoutXAxisAnchor, anchorY:NSLayoutYAxisAnchor, equalAnchorY:NSLayoutYAxisAnchor) { view.addSubview(self) anchorX.constraintEqualToAnchor(equalAnchorX).active = true anchorY.constraintEqualToAnchor(equalAnchorY).active = true } } 

我们没有为UIStackView设置一个大小,而是包含在其中的东西决定了它的大小。 还要注意在UIStackView扩展中将translatesAutoresizingMaskIntoConstraints设置为false。 (只需要我们为堆栈视图设置这个属性,它的子视图只是inheritance了这个行为。)

具有数据源代码的UITableView类

接下来,我创build了一个用于演示目的的基本表类。

 class MyTable: UITableView, UITableViewDataSource { let data = ["January","February","March","April","May","June","July","August","September","October","November","December"] func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return data.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("SauceCell", forIndexPath: indexPath) cell.textLabel?.text = data[indexPath.row] return cell } } 

堆栈视图和表视图控制器的设置

最后,重要的东西。 只要我们将表格添加到堆栈视图中,所有的框架信息都将被忽略。 所以我们需要最后两行代码来设置表格的宽度和高度,以便自动布局可以理解。

 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let table = MyTable(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height)) table.registerClass(UITableViewCell.self, forCellReuseIdentifier: "SauceCell") table.dataSource = table let stack = UIStackView(axis: .Vertical, spacing: 10) stack.anchorStackView(toView: view, anchorX: stack.centerXAnchor, equalAnchorX: view.centerXAnchor, anchorY: stack.centerYAnchor, equalAnchorY: view.centerYAnchor) stack.addArrangedSubview(table) table.widthAnchor.constraintEqualToAnchor(view.widthAnchor, multiplier: 1).active = true table.heightAnchor.constraintEqualToAnchor(view.heightAnchor, multiplier: 0.5).active = true } } 

请注意,我们使用addArrangedSubview: not addSubview:将视图添加到堆栈视图时。

(我已经写了有关UIStackView的博客post ,以及其他一些关于自动布局的一般 ,也可能有帮助。)

我遇到了同样的问题,并意识到你需要一个自我大小的表格视图。 我偶然发现了这个答案,并创build了一个像@MuHAOSbuild议的子类。 我没有遇到任何问题。

 class IntrinsicTableView: UITableView { override var contentSize:CGSize { didSet { self.invalidateIntrinsicContentSize() } } override var intrinsicContentSize: CGSize { self.layoutIfNeeded() return CGSize(width: UIViewNoIntrinsicMetric, height: contentSize.height) } }