#ios #swift #tableview #uitabbarcontroller #xcode11
#iOS #swift #просмотр таблицы #uitabbarcontroller #xcode11
Вопрос:
Невозможно увидеть панель поиска в заголовке раздела TableView все выполняется программно, раскадровки не используются
import UIKit
class ConversationsViewController: UITableViewController {
let searchBar:UISearchBar = {
let bar = UISearchBar()
bar.placeholder = "search conversations"
bar.translatesAutoresizingMaskIntoConstraints = false
return bar
}()
let headerView:UIView = {
let hView = UIView()
// hView.backgroundColor = .red
hView.translatesAutoresizingMaskIntoConstraints = false
return hView
}()
// we want custom cell and header view
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
}
// override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
// return "section (section)"
// }
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
headerView.addSubview(searchBar)
searchBar.centerXAnchor.constraint(equalTo: headerView.centerXAnchor).isActive = true
searchBar.centerYAnchor.constraint(equalTo: headerView.centerYAnchor).isActive = true
searchBar.heightAnchor.constraint(equalToConstant: 100).isActive = true
searchBar.widthAnchor.constraint(equalToConstant: 40).isActive = true
return headerView
}
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 70
}
}
Я пробовал разные способы, но я нашел этот метод для добавления заголовка в TableView, и теперь я не могу понять, как добавить эту панель поиска в headerView, я пробовал выше, но это не работает, пожалуйста, помогите спасибо
Ответ №1:
Пара вещей…
Для представления заголовка раздела НЕ должно быть .translatesAutoresizingMaskIntoConstraints
установлено значение false
. Оставьте значение по умолчанию true
.
Не указывайте UISearchBar
ограничение высоты — пусть оно использует свою внутреннюю высоту.
Нам нужно задать ограничение ширины панели поиска. Если вы хотите, чтобы он соответствовал ширине таблицы, используйте:
searchBar.widthAnchor.constraint(equalTo: headerView.widthAnchor, constant: 0.0).isActive = true
Если вы хотите, чтобы это была только частичная ширина, либо присвоите этой строке отрицательное значение для constant
, либо используйте множитель:
// this will make the search bar 90% of the width of the table
searchBar.widthAnchor.constraint(equalTo: headerView.widthAnchor, multiplier: 0.9).isActive = true
Вот ваш класс с этими изменениями:
class ConversationsViewController: UITableViewController {
let searchBar:UISearchBar = {
let bar = UISearchBar()
bar.placeholder = "search conversations"
bar.translatesAutoresizingMaskIntoConstraints = false
return bar
}()
let headerView:UIView = {
let hView = UIView()
// give it a background color so we can easily see
// if it is laying out correctly
hView.backgroundColor = .red
// section header view should leave this at the default TRUE
//hView.translatesAutoresizingMaskIntoConstraints = false
return hView
}()
override func viewDidLoad() {
super.viewDidLoad()
}
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
// add the searchBar
headerView.addSubview(searchBar)
// center it horizontally and vertically
searchBar.centerXAnchor.constraint(equalTo: headerView.centerXAnchor).isActive = true
searchBar.centerYAnchor.constraint(equalTo: headerView.centerYAnchor).isActive = true
// don't set height constraint - use UISearchBar intrinsic height
//searchBar.heightAnchor.constraint(equalToConstant: 100).isActive = true
// constrain width equal to headerView width
// we can adjust the constant if we don't want it to span the entire width of the table
// by using a negative value for the constant, or using a mulitplier to get a percent of the width
searchBar.widthAnchor.constraint(equalTo: headerView.widthAnchor, constant: 0.0).isActive = true
return headerView
}
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 70
}
}