首页 > 解决方案 > iOS 13 / Swift 5:SearchController SearchBar 在编辑结束时展开

问题描述

我在 UITableView 的 ContainerView 中遇到了 UISearchBar(XCode 11、iOS 13、Swift 5)的问题。在那里我创建了一个 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
}

标签: iosuikituisearchbaruisearchcontrollerswift5

解决方案


将这些方法称为 UISearchControllerDelegate:

func didPresentSearchController(_ searchController: UISearchController)
    {
        searchController.searchBar.frame = CGRect(x: 0, y: 0, width: 266, height: searchController.searchBar.frame.size.height)
    }

func didDismissSearchController(_ searchController: UISearchController)
    {
        searchController.searchBar.frame = CGRect(x: 0, y: 0, width: 266, height: searchController.searchBar.frame.size.height)
    }

推荐阅读