gpt4 book ai didi

ios - 防止 UIStackView 压缩 UITableView

转载 作者:行者123 更新时间:2023-11-28 23:30:32 36 4
gpt4 key购买 nike

我正在将 UITableView 添加到垂直 UIStackView 中。垂直的 UIStackView 在 UIScrollView 中。

但是,除非我对其施加明确的高度约束,否则表格不会显示,而我显然不想这样做。

根据这个SO问答UITableView not shown inside UIStackView这是因为“stackview 试图尽可能地压缩内容”

如果我将 UILabel 添加到 StackView,它会正常显示。 UITableView 有一些特殊之处,这意味着它不是。我正在使用 Xamarin 并在代码中创建 UITableView

this.recentlyOpenedPatientsTable = new UITableView()
{
RowHeight = UITableView.AutomaticDimension,
EstimatedRowHeight = 44.0f,
AllowsMultipleSelectionDuringEditing = false,
TranslatesAutoresizingMaskIntoConstraints = false,
Editing = false,
BackgroundColor = UIColor.Clear,
TableFooterView = new UIView(),
ScrollEnabled = false,
};

UIScrollView 固定在 View 的顶部、底部、左侧和右侧并且工作正常。它达到了我期望的高度。

我已经尝试了这个 SO 问题中的两个建议,但都没有用。我发现我找不到其他人有这个问题,这很奇怪。

还有什么建议吗?

最佳答案

这是一个非常基本的示例,使用 UITableView 子类使其根据内容自动调整高度。

红色按钮(在水平堆栈 View 中)是垂直堆栈 View 中第一个排列的 subview

接下来是表格(单元格的 contentView 的绿色背景,多行标签的黄色背景)。

最后排列的子View是青色背景UILabel:

enter image description here

请注意,垂直堆栈 View 与顶部、前导和尾部的距离限制为 40 点,并且距离底部至少 40 点。如果您向表格添加的行数超过了可用高度,则必须滚动才能看到额外的行。

//
// TableInStackViewController.swift
//
// Created by Don Mag on 6/24/19.
//

import UIKit

final class ContentSizedTableView: UITableView {

override var contentSize:CGSize {
didSet {
invalidateIntrinsicContentSize()
}
}

override var intrinsicContentSize: CGSize {
layoutIfNeeded()
return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
}

}

class TableInStackCell: UITableViewCell {

let theLabel: UILabel = {
let v = UILabel()
v.translatesAutoresizingMaskIntoConstraints = false
v.backgroundColor = .yellow
v.textAlignment = .left
v.numberOfLines = 0
return v
}()

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)

contentView.backgroundColor = .green

contentView.addSubview(theLabel)

NSLayoutConstraint.activate([

theLabel.topAnchor.constraint(equalTo: contentView.layoutMarginsGuide.topAnchor, constant: 0.0),
theLabel.bottomAnchor.constraint(equalTo: contentView.layoutMarginsGuide.bottomAnchor, constant: 0.0),
theLabel.leadingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.leadingAnchor, constant: 0.0),
theLabel.trailingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.trailingAnchor, constant: 0.0),

])

}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}


}

class TableInStackViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

let theStackView: UIStackView = {
let v = UIStackView()
v.translatesAutoresizingMaskIntoConstraints = false
v.axis = .vertical
v.alignment = .fill
v.distribution = .fill
v.spacing = 8
return v
}()

let addButton: UIButton = {
let v = UIButton()
v.translatesAutoresizingMaskIntoConstraints = false
v.setTitle("Add a Row", for: .normal)
v.backgroundColor = .red
return v
}()

let deleteButton: UIButton = {
let v = UIButton()
v.translatesAutoresizingMaskIntoConstraints = false
v.setTitle("Delete a Row", for: .normal)
v.backgroundColor = .red
return v
}()

let buttonsStack: UIStackView = {
let v = UIStackView()
v.axis = .horizontal
v.alignment = .fill
v.distribution = .fillEqually
v.spacing = 20
return v
}()

let theTable: ContentSizedTableView = {
let v = ContentSizedTableView()
v.translatesAutoresizingMaskIntoConstraints = false
return v
}()

let bottomLabel: UILabel = {
let v = UILabel()
v.translatesAutoresizingMaskIntoConstraints = false
v.backgroundColor = .cyan
v.textAlignment = .center
v.numberOfLines = 0
v.text = "This label is the last element in the stack view."
// prevent label from being compressed when the table gets too tall
v.setContentCompressionResistancePriority(.required, for: .vertical)
return v
}()

var theTableData: [String] = [
"Content Sized Table View",
"This row shows that the cell heights will auto-size, based on the cell content (multi-line label in this case).",
"Here is the 3rd default row",
]

var minRows = 1

let reuseID = "TableInStackCell"

override func viewDidLoad() {
super.viewDidLoad()

minRows = theTableData.count

view.addSubview(theStackView)

NSLayoutConstraint.activate([

// constrain stack view 40-pts from top, leading and trailing
theStackView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 40.0),
theStackView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 40.0),
theStackView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -40.0),

// constrain stack view *at least* 40-pts from bottom
theStackView.bottomAnchor.constraint(lessThanOrEqualTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -40.0),

])

buttonsStack.addArrangedSubview(addButton)
buttonsStack.addArrangedSubview(deleteButton)

theStackView.addArrangedSubview(buttonsStack)
theStackView.addArrangedSubview(theTable)
theStackView.addArrangedSubview(bottomLabel)

theTable.delegate = self
theTable.dataSource = self

theTable.register(TableInStackCell.self, forCellReuseIdentifier: reuseID)

addButton.addTarget(self, action: #selector(addRow), for: .touchUpInside)
deleteButton.addTarget(self, action: #selector(deleteRow), for: .touchUpInside)

}

@objc func addRow() -> Void {
// add a row to our data source
let n = theTableData.count - minRows
theTableData.append("Added Row: \(n + 1)")
theTable.reloadData()
}

@objc func deleteRow() -> Void {
// delete a row from our data source (keeping the original rows intact)
let n = theTableData.count
if n > minRows {
theTableData.remove(at: n - 1)
theTable.reloadData()
}
}

func numberOfSections(in tableView: UITableView) -> Int {
return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return theTableData.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: reuseID, for: indexPath) as! TableInStackCell
cell.theLabel.text = theTableData[indexPath.row]
return cell
}

}

关于ios - 防止 UIStackView 压缩 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56716147/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com