如何自动调整显示搜索结果的tableView的大小?

时间:2018-09-12 12:35:53

标签: ios swift anchor

这就是我添加UITableView的方式:

tableView = UITableView()
tableView.dataSource = self
tableView.delegate = self
tableView.register(UINib(nibName: "TableViewCell", bundle: nil), forCellReuseIdentifier: "Cell")
tableView.rowHeight = 60.0
tableView.tableFooterView = UIView()
view.addSubview(tableView)

tableView.translatesAutoresizingMaskIntoConstraints = false

tableViewHeightAnchor = tableView.heightAnchor.constraint(equalToConstant: 0)
let constraints = [tableView.topAnchor.constraint(equalTo: view.topAnchor), tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor), tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor), tableViewHeightAnchor!]
NSLayoutConstraint.activate(constraints)

尤其是这一部分很重要:

tableView.topAnchor.constraint(equalTo: view.topAnchor)

在尝试将其连接到UISearchController的searchBar底部之前,但在这种情况下,它崩溃了。

和我的

func updateSearchResults(for searchController: UISearchController) {
    filterContentForSearchText(searchController.searchBar.text!)
    tableView.reloadData()

    UIView.animate(withDuration: 0.6) {
        self.tableViewHeightAnchor.constant = self.tableView.contentSize.height
    }
}

我正在调整高度锚,并将其设置为等于tableView的contentSize。 但我有一个问题:

当只有1-2行要显示时,我根本看不到tableView!我只能在contentSize上添加+200.0时才能看到它,但是此解决方案非常糟糕且难以控制,因为在这种情况下无法正确显示。

我该如何解决?这是我第一次尝试用代码进行所有设计,这有时真的很令人困惑。也许有人可以向我解释那里出了什么问题

3 个答案:

答案 0 :(得分:0)

仅继承UITableView的子类并覆盖intrinsicContentSize属性。

class IntrinsicTableView: UITableView {

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

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

答案 1 :(得分:0)

您可以尝试使用这些约束,这些约束将自动为您调整大小,直到高度达到与屏幕相同的高度为止,然后表格视图将允许滚动。

NSLayoutConstraint(item: tableView, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1, constant: 0).isActive = true
NSLayoutConstraint(item: tableView, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1, constant: 0).isActive = true
NSLayoutConstraint(item: tableView, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1, constant: 0).isActive = true
NSLayoutConstraint(item: tableView, attribute: .bottom, relatedBy: .greaterThanOrEqual, toItem: self, attribute: .bottom, multiplier: 1, constant: 0).isActive = true

答案 2 :(得分:0)

在设置高度约束常量后,使用 layoutIfNeeded()

如果只是想让tableview看起来像调整大小,则将分隔符设置为none 并在单元格内添加一行,以便tableView视图看起来像是调整大小,但仍与屏幕大小相同。