iOS 13 / Swift 5: панель поиска SearchController расширяется после завершения редактирования - PullRequest
2 голосов
/ 10 октября 2019

У меня проблема с UISearchBar (XCode 11, iOS 13, Swift 5) внутри ContainerView в UITableView. Там я создал UIView (searchView) и sortView рядом друг с другом, чтобы пользователь мог искать и сортировать результаты.

Пока проблем нет, но когда я заканчиваю поиск, нажав кнопку отменыПанель поиска, панель поиска расширяется до полной ширины экрана и перекрывает sortView.

Ситуация до активации поиска

Ситуация с активным поиском

Неправильное поведение после деактивации поиска

Как можно сохранить панель поиска внутри своего суперпредставления (searchView)?

Я уже установил некоторые ограничения для этого, но безуспешно.

См. Также некоторый код:

func viewDidLoad() {
     ...

    searchController.searchBar.placeholder = "SR durchsuchen ..."
    searchController.searchBar.tintColor = UIColor.white
    searchController.dimsBackgroundDuringPresentation = false
    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "Ende"
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.searchBar.delegate = self

    searchView.addSubview(searchController.searchBar)

    ...
    }


override func viewDidLayoutSubviews() {

    self.searchController.searchBar.sizeToFit()

}

override func viewWillDisappear(_ animated: Bool) {

    self.searchController.definesPresentationContext = false
    self.searchController.isActive = false

}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    let searchTextField = self.searchController.searchBar.searchTextField
    searchTextField.textColor = UIColor(named: "searchFieldTextColor")
    searchTextField.leftView?.tintColor = UIColor(named: "searchFieldTextColor")

    searchController.searchBar.frame.size.width = searchView.frame.size.width
    searchController.searchBar.frame.size.height = searchView.frame.size.height

}

override func viewWillLayoutSubviews() {

    searchController.searchBar.frame = CGRect(x: 0, y: 0, width: searchView.frame.width, height: searchView.frame.height)
    searchController.searchBar.sizeToFit()

    let margins = searchView.layoutMarginsGuide
    searchController.searchBar.trailingAnchor.constraint(equalTo: margins.trailingAnchor, constant: 0).isActive = true
    searchController.searchBar.topAnchor.constraint(equalTo: margins.topAnchor, constant: 0).isActive = true
    searchController.searchBar.leadingAnchor.constraint(equalTo: margins.leadingAnchor, constant: 0).isActive = true
    searchController.searchBar.bottomAnchor.constraint(equalTo: margins.bottomAnchor, constant: 0).isActive = true
}
...