UITableViewCell内的可滚动StackView-ScrollView ContentSize未更新

问题描述 投票:0回答:1

我最近开始学习Swift和iOS应用开发。到目前为止,我一直在进行php后端和低级iOS / macOS编程,并且对UI的使用对我来说有点困难,所以请容忍我的愚蠢。

如果我理解正确,则stackviews会自动间隔并在其框架中包含其子视图。所有的数学和布局都是由它自动完成的。我在自定义UITableViewCell中有一个水平stackview。 UIStackView位于UIScrollView之内,因为我希望内容可滚动。我已经以编程方式设置了锚点(我只是不知道如何使用情节提要小东西)。 This is what the cells look like

当我加载视图时,stackview不会滚动。但是如果我至少选择一次该单元格,它会滚动。滚动视图的contentSize在我的自定义单元格的layoutsubviews方法内设置。

我的自定义单元格

class TableViewCell: UITableViewCell
{
    let stackViewLabelContainer  = UIStackView()
    let scrollViewContainer = UIScrollView()

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?)
    {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        backgroundColor = .black
        stackViewLabelContainer.axis = .horizontal
        stackViewLabelContainer.distribution = .equalSpacing
        stackViewLabelContainer.alignment = .leading
        stackViewLabelContainer.spacing = 5
        for _ in 1...10
        {
            let labelView = UILabel();
            labelView.backgroundColor = tintColor
            labelView.textColor = .white
            labelView.text = "ABCD 123"

            stackViewLabelContainer.addArrangedSubview(labelView)
        }
        scrollViewContainer.addSubview(stackViewLabelContainer)
        stackViewLabelContainer.translatesAutoresizingMaskIntoConstraints = false
        stackViewLabelContainer.leadingAnchor.constraint(equalTo: scrollViewContainer.leadingAnchor).isActive = true
        stackViewLabelContainer.topAnchor.constraint(equalTo: scrollViewContainer.topAnchor).isActive = true
        addSubview(scrollViewContainer)
        scrollViewContainer.translatesAutoresizingMaskIntoConstraints = false
        scrollViewContainer.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 10).isActive = true
        scrollViewContainer.topAnchor.constraint(equalTo: topAnchor, constant: 5).isActive = true
        scrollViewContainer.heightAnchor.constraint(equalTo:stackViewLabelContainer.heightAnchor).isActive = true
        scrollViewContainer.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
        scrollViewContainer.showsHorizontalScrollIndicator = false



    }

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

    override func layoutSubviews()
    {
        super.layoutSubviews()
        scrollViewContainer.contentSize = CGSize(width: stackViewLabelContainer.frame.width, height: stackViewLabelContainer.frame.height)

    }





}

这里是TableViewController

class TableViewController: UITableViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()
        tableView.register(TableViewCell.self, forCellReuseIdentifier: "reuse_cell")

    }

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

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return 5
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuse_cell") as! TableViewCell
        return cell
    }

    override func viewDidLayoutSubviews()
    {
        print("called")
        super.viewDidLayoutSubviews()
//        let cells  = tableView.visibleCells as! Array<TableViewCell>
//        cells.forEach
//        {
//            cell in
//            cell.scrollViewContainer.contentSize = CGSize(width: cell.stackViewLabelContainer.frame.width, height: cell.stackViewLabelContainer.frame.height)
//
//        }
    }

}

我想出一种方法来完成这项工作,但是它影响抽象,感觉就像是一个奇怪的hack。您可以从UITableViewController中获得可见的单元格,访问每个滚动视图并更新其contentSize。我通过反转dyld_shared_cache发现了另一个修复方法,在该方法中,我重写draw方法并停止重用单元格。两种解决方案都感觉它们离“正确”还差得远。

ios swift uitableview uiscrollview uistackview
1个回答
0
投票

您应将滚动视图限制为单元格的contentView。

contentView.addSubview(scrollView)
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.topAnchor.constraint(equalTo: contentView.safeAreaLayoutGuide.topAnchor).isActive = true
contentView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
scrollView.leadingAnchor.constraint(equalTo: contentView.safeAreaLayoutGuide.leadingAnchor).isActive = true
scrollView.trailingAnchor.constraint(equalTo: contentView.safeAreaLayoutGuide.trailingAnchor).isActive = true
scrollView.addSubview(stackView)

stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
stackView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

现在您可以循环播放标签并将其添加为排列的子视图

for _ in 1...10
{
                let labelView = UILabel();
                labelView.backgroundColor = tintColor
                labelView.textColor = .white
                labelView.text = "ABCD 123"

                stackView.addArrangedSubview(labelView)
 }
© www.soinside.com 2019 - 2024. All rights reserved.