Как автоматически изменить размер tableView, который отображает результаты поиска? - PullRequest
0 голосов
/ 12 сентября 2018

Вот как я добавляю 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, но в этом случае он падал.

а по моему

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

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

Я настраивал якорь высоты и устанавливал его равным contentSize таблицы. но у меня проблема:

Когда отображается только 1-2 строки, я вообще не вижу свой tableView! Я вижу это только тогда, когда добавляю +200.0 к contentSize, но это решение очень плохое и его трудно контролировать, поскольку в этом случае оно отображалось некорректно.

Как я могу это исправить? Это мой первый раз, когда я пытаюсь сделать весь свой дизайн в коде, и это иногда сбивает с толку. Может быть, кто-то может объяснить мне, что там не так

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Вы можете попробовать использовать эти ограничения, которые должны автоматически изменять его размер до тех пор, пока высота не достигнет той же высоты, что и экран, тогда просмотр таблицы позволит прокручивать.

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
0 голосов
/ 12 сентября 2018

Используйте layoutIfNeeded () после установки константы для ограничения высоты.

Если просто хотите, чтобы табличное представление выглядело так, как будто оно было изменено, то установите Разделитель на ноль и добавьте строку внутри ячейки, чтобы представление tableView выглядело так, как будто оно изменено, но оно остается таким же, как размер экрана.

0 голосов
/ 12 сентября 2018

Просто подкласс 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)
    }
}
...