我有一个非常令人沮丧的问题,我确信有一个简单的解决方案,但对于我的生活,我无法弄明白。
我在UIViewController中有一个UITableView。在工具栏上,我有一个可以显示/隐藏搜索栏的按钮。一切都很好,除了讨厌的事实,搜索栏,选择后,向上移动8个像素(UITableView和SuperView之间的原始边距),并在宽度上扩展到等于完整的超级视图。
我已经使用函数searchBarFrame()解决了宽度问题,但它会切断"取消"按钮减半,所以它并不完美(见下文)。我真的很感激对这两个问题的看法。我已经根据我发现的其他解决方案尝试了Extend Edges和Scroll View Insets的所有组合,但没有任何对我有用。我真的不想使用导航栏作为搜索栏,也不想完全转换为UITableViewController。必须有办法使这项工作!
这是我的(相关?)代码:
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()
}
}
答案 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
}