Ios UI搜索栏的宽度和位置在选择时发生变化
我有一个非常令人沮丧的问题,我确信有一个简单的解决方案,但对于我的生活,我想不出来 我在UIViewController中有一个UITableView。在工具栏上,我有一个按钮,可以显示/隐藏搜索栏。除了搜索栏在选择时向上移动8个像素(UITableView和SuperView之间的原始边距)并在宽度上扩展到与整个SuperView相等这一令人恼火的事实之外,一切都很好 我已经修复了searchBarFrame()函数的宽度问题,但是,它将“Cancel”按钮一分为二,所以它并不完美(见下文)。对于这两个问题,我真的很感激你的任何想法。基于我找到的其他解决方案,我尝试了扩展边和滚动视图插入的每一种组合,但都不管用。我真的不想使用导航栏作为搜索栏,也不想完全转换为UITableViewController。一定有办法做到这一点 以下是我的(相关?)代码:Ios UI搜索栏的宽度和位置在选择时发生变化,ios,swift,xcode,uitableview,uisearchbar,Ios,Swift,Xcode,Uitableview,Uisearchbar,我有一个非常令人沮丧的问题,我确信有一个简单的解决方案,但对于我的生活,我想不出来 我在UIViewController中有一个UITableView。在工具栏上,我有一个按钮,可以显示/隐藏搜索栏。除了搜索栏在选择时向上移动8个像素(UITableView和SuperView之间的原始边距)并在宽度上扩展到与整个SuperView相等这一令人恼火的事实之外,一切都很好 我已经修复了searchBarFrame()函数的宽度问题,但是,它将“Cancel”按钮一分为二,所以它并不完美(见下文
我认为使用
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)
])
跟进,以防其他人遇到此问题。经过大量的时间和努力,我从来没有得到我原来的设置工作。相反,我从零开始,并与之不同 在storyboard中(您也可以通过编程来实现这一点,但我走了一条更简单的路线,因为我受够了),我在UIView中的UIStackView中放置了一个UISearchBar。我将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
}
在searchBarFrame()中,尝试打印“tableView.frame.size.width”,并检查是否打印了预期的宽度,以及您是如何设置tableView框架的?@vincent joy我使用故事板中的自动布局设置了视图。我在updateSearchResults中打印了两个框架,使用:
print(“搜索栏框架:\(self.view.convert(searchController.Searchbar.frame,to:searchController.Searchbar.superview)))print(“Tableview框架:\(Tableview.frame)”
这些是结果:搜索栏框架:(-20.0,0.0414.0,56.0)Tableview框架:(20.0,8.0,374.0,612.0)虽然我不需要调整tableview的位置,只需要调整搜索栏(searchcontroller.view),但听起来这可能会有所帮助。但是我应该把这个代码放在哪里呢?它不断地向我袭来。
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
}