UISearchBar宽度和位置在选择时更改

时间:2018-02-24 06:06:34

标签: ios swift xcode uitableview uisearchbar

我有一个非常令人沮丧的问题,我确信有一个简单的解决方案,但对于我的生活,我无法弄明白。

我在UIViewController中有一个UITableView。在工具栏上,我有一个可以显示/隐藏搜索栏的按钮。一切都很好,除了讨厌的事实,搜索栏,选择后,向上移动8个像素(UITableView和SuperView之间的原始边距),并在宽度上扩展到等于完整的超级视图。

showSearchController() Selected

我已经使用函数searchBarFrame()解决了宽度问题,但它会切断"取消"按钮减半,所以它并不完美(见下文)。我真的很感激对这两个问题的看法。我已经根据我发现的其他解决方案尝试了Extend Edges和Scroll View Insets的所有组合,但没有任何对我有用。我真的不想使用导航栏作为搜索栏,也不想完全转换为UITableViewController。必须有办法使这项工作!

Width Fixed?

这是我的(相关?)代码:

class ListVC: UIViewController UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating {

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var searchBtn: UIBarButtonItem!

let searchController: UISearchController = UISearchController(searchResultsController: nil)

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.dataSource = self
    tableView.delegate = self
}

func searchBarFrame() {
    var searchBarFrame = searchController.searchBar.frame
    searchBarFrame.size.width = tableView.frame.size.width
    searchController.searchBar.frame = searchBarFrame
}

func showSearchController() {
    searchController.isActive = true
    searchBarFrame()

    searchController.searchResultsUpdater = self
    searchController.searchBar.delegate = self

    searchController.dimsBackgroundDuringPresentation = false
    searchController.hidesNavigationBarDuringPresentation = false
    definesPresentationContext = true

    searchController.searchBar.placeholder = "Search Places"
    searchController.searchBar.roundCorners(corners: [.topLeft, .topRight, .bottomLeft, .bottomRight], radius: 5.0)
    searchController.searchBar.barTintColor = UIColor.blurColor

    tableView.tableHeaderView = searchController.searchBar
}

func hideSearchController() {
    tableView.tableHeaderView = nil
    searchController.isActive = false
}

@IBAction func onSearchBtnPress(sender: UIBarButtonItem) {
    if !searchController.isActive {
        showSearchController()
    } else {
        hideSearchController()
    }
}

2 个答案:

答案 0 :(得分:0)

我认为使用NSLayoutConstraint来定位和调整视图大小可以解决这个问题。

例如:

private let margin: CGFloat = 15.0

tableView.translatesAutoresizingMaskIntoConstraints = false
searchBar.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    tableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: margin),
    tableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: margin),
    tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
    tableView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
    searchBar.widthAnchor.constraint(equalTo: tableView.widthAnchor)
])

答案 1 :(得分:0)

跟进,以防其他人遇到此问题。经过大量的时间和精力,我从来没有让我的原始设置工作。相反,我从零开始,以不同的方式接近它。

在storyboard中(你也可以通过编程方式执行此操作,但由于我受够了,因此我选择了更简单的路径),我将UISearchBar放在UIStackView内的UIView中。我将Stackview的前导和尾随约束设置为uitableview,uitableview的底部到顶部以及顶部布局视图的顶部到底部。 UIView的唯一约束是高度为56(典型的搜索栏高度),优先级为999(如果要显示和隐藏)。

这修复了一切,代码也非常简单。

class MyVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        searchBar.delegate = self
        searchView.isHidden = true
    }

    @IBAction func onSearchBtnPress(sender: UIBarButtonItem) {
        if searchView.isHidden {
            searchView.isHidden = false
        } else {
            searchView.isHidden = true
        }
    }
}

extension MyVC: UISearchBarDelegate {

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        // do something
}