通过搜索栏的快速教程,并发现我可以使用searchBar.sizeToFit()
自动调整搜索栏,但搜索栏的右端仍然会延伸到屏幕之外。
class MainViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating, UISearchBarDelegate {
var searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchBar.delegate = self
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.sizeToFit()
tableView.tableHeaderView = searchController.searchBar
definesPresentationContext = true
}}
我尝试用searchController.searchBar.frame = CGRectMake(0, 0, 200, 200)
之类的东西手动设置框架,但宽度仍然偏离屏幕。故事板中不存在搜索栏,但tableView不存在。
答案 0 :(得分:2)
如果您正在使用自动布局,则使用前沿和后沿而不是宽度约束。
答案 1 :(得分:1)
需要为搜索栏所属的tableView设置自动布局约束。设置这些修复了尺寸问题。
答案 2 :(得分:0)
只需单击下面给出的Pin选项并选择顶部,前导(左)和尾(右)约束,然后单击Add 3 constraints。确保未选中“约束到边距”复选框。如果约束满足,则不会有警告。尝试更改搜索栏的背景颜色,以查看其在屏幕上的位置。
答案 3 :(得分:0)
如果设置自动布局限制并不能解决问题,请尝试在searchController.searchBar.sizeToFit()
而不是viewWillLayoutSubviews()
中调用viewDidLoad()
。如果搜索栏包含在表标题视图以外的视图中,这可能会有所帮助。
答案 4 :(得分:0)
Swift 4,适用于所有类型的ViewController
经过无数小时的反复试验,这就是我想为那些希望在代码中使用它的人准备的东西:
设置代表
SearchDatasourceController类:UIViewController,UISearchBarDelegate {}
设置一个customTitleView和searchBar
重要提示:设置框架
lazy var customTitleView: UIView = {
var view = UIView()
let frame = CGRect(x: 0, y: 0, width: 300, height: 44)
view.frame = frame
return view
}()
lazy var searchBar: UISearchBar = {
let searchBar = UISearchBar()
searchBar.placeholder = "Search"
searchBar.autocapitalizationType = .none
searchBar.backgroundImage = UIImage()
(searchBar.value(forKey: "searchField") as? UITextField)?.backgroundColor = UIColor(r: 230, g: 230, b: 230)
searchBar.delegate = self
searchBar.becomeFirstResponder()
let frame = CGRect(x: 0, y: 0, width: 300, height: 44)
searchBar.frame = frame
return searchBar
}()
在viewDidLoad中添加用于保存searchBar的customTitleView
覆盖func viewDidLoad(){ super.viewDidLoad()
customTitleView.addSubview(searchBar)
navigationItem.titleView = customTitleView
searchBar.becomeFirstResponder()
}
添加委托方法以侦听搜索结果
func searchBar(_ searchBar:UISearchBar,textDidChange searchText:String){ 打印(searchText) }
确保将您的视图控制器显示在导航堆栈上
func handleSearchBarButtonItemTapped(){ 让控制器= SearchDatasourceController() navigationController?.pushViewController(控制器,动画:true) }