Не удается добавить панель пользовательского поиска в headerView (вид заголовка tableview)?

#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
    }
    
}