以编程方式显示 UISearchController 的搜索栏
Display UISearchController's searchbar programmatically
注意 1: 这个问题与在 table 视图之外添加 UISearchController 的搜索栏有关 - 不是 table 视图的 header.
注 2: 经过反复试验,我找到了解决方案。请看下面我的。
我是 iOS 开发的新手,正在努力使用 UISearchController class。我有一个视图控制器,在我的视图控制器的视图中,我计划在 table 视图上方设置一个搜索栏。我希望搜索栏链接到 UISearchController。由于界面构建器不附带 UISearchController,因此我以编程方式添加控制器。在实例化 UISearchController 之后,我尝试以编程方式将搜索控制器的搜索栏添加到我的视图中,但没有成功。我试过设置搜索栏的框架并给它自动布局约束,但是这两种方法对我都不起作用(即当我 运行 应用程序时,什么也没有出现)。这是我尝试过的最新代码:
let searchController = UISearchController(searchResultsController: nil)
// Set the search bar's frame
searchController.searchBar.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 50)
// Constraint to pin the search bar to the top of the view
let topConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)
searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(searchController.searchBar)
self.view.addConstraint(topConstraint)
如有任何帮助,我们将不胜感激!谢谢!
编辑: 仅使用设置搜索栏框架或给它自动布局约束中的一个(而不是我最初尝试的组合)似乎首先起作用,但在点击搜索栏后,您会遇到 Dwight 指出的问题。我已经留下了这些案例的代码,以防与您当前拥有的代码进行比较会有所帮助,但对于有效的解决方案,请参阅下面的答案。
使用自动布局约束:
let searchController = UISearchController(searchResultsController: nil)
let topConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: (statusBarHeight + navigationBarHeight!))
let leftConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Left, multiplier: 1, constant: 0)
let rightConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Right, multiplier: 1, constant: 0)
let heightConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 44)
searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(false)
searchController.searchBar.addConstraint(heightConstraint)
self.view.addSubview(searchController.searchBar)
self.view.addConstraints([topConstraint, leftConstraint, rightConstraint])
我已将 topConstraint 常量设置为状态栏的高度加上导航栏的高度,因为我的视图控制器嵌入在导航控制器中。
调整框架:
let searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.frame = CGRect(x: 0, y: (statusBarHeight + navigationBarHeight!), width: self.view.frame.size.width, height: 44)
self.view.addSubview(searchController.searchBar)
试试这个:
let searchController = UISearchController(searchResultsController: nil).searchBar
// Set the search bar's frame
searchController.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 50)
// Constraint to pin the search bar to the top of the view
let topConstraint = NSLayoutConstraint(item: searchController, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)
// searchController.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(searchController)
// self.presentViewController(searchController, animated: true, completion: nil)
self.view.addConstraint(topConstraint)
或者您可以这样做:
searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(false)
-> searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(true)
经过反复试验,我有以下可行的解决方案:
- 打开 Main.storyboard 并向您的视图控制器添加一个高度为 44(UISearchBar 的默认高度)的 UIView 和一个 UITableView。设置自动布局约束,以便将 UIView 固定到两侧和顶部布局指南(使用顶部布局指南确保无论您的视图控制器是否嵌入导航控制器中,这都有效)和 table视图固定在两侧,底部布局指南,其顶部固定在 UIView 的底部。
- 在您的 ViewController.swift 中将 UIView 和 UITableView 连接为 IBOutlets。在我的项目中,我称它们为 topView 和 tableView.
- 在 ViewController.swift 的顶部声明一个搜索控制器:
var searchController: UISearchController!
然后,在viewDidLoad()中,你需要:
// Initialize and set up the search controller
self.searchController = UISearchController(searchResultsController: nil)
self.searchController.searchResultsUpdater = self
self.searchController.dimsBackgroundDuringPresentation = false // Optional
self.searchController.searchBar.delegate = self
// Add the search bar as a subview of the UIView you added above the table view
self.topView.addSubview(self.searchController.searchBar)
// Call sizeToFit() on the search bar so it fits nicely in the UIView
self.searchController.searchBar.sizeToFit()
// For some reason, the search bar will extend outside the view to the left after calling sizeToFit. This next line corrects this.
self.searchController.searchBar.frame.size.width = self.view.frame.size.width
应该是这个!当然,您需要使您的视图控制器成为 UITableViewDatasource、UITableViewDelegate、UISearchBarDelegate、UISearchControllerDelegate 和 UISearchResultsUpdating 并处理所有必需的委托方法,但就搜索栏而言,这对我有用。有问题请评论
注意 1: 这个问题与在 table 视图之外添加 UISearchController 的搜索栏有关 - 不是 table 视图的 header.
注 2: 经过反复试验,我找到了解决方案。请看下面我的
我是 iOS 开发的新手,正在努力使用 UISearchController class。我有一个视图控制器,在我的视图控制器的视图中,我计划在 table 视图上方设置一个搜索栏。我希望搜索栏链接到 UISearchController。由于界面构建器不附带 UISearchController,因此我以编程方式添加控制器。在实例化 UISearchController 之后,我尝试以编程方式将搜索控制器的搜索栏添加到我的视图中,但没有成功。我试过设置搜索栏的框架并给它自动布局约束,但是这两种方法对我都不起作用(即当我 运行 应用程序时,什么也没有出现)。这是我尝试过的最新代码:
let searchController = UISearchController(searchResultsController: nil)
// Set the search bar's frame
searchController.searchBar.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 50)
// Constraint to pin the search bar to the top of the view
let topConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)
searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(searchController.searchBar)
self.view.addConstraint(topConstraint)
如有任何帮助,我们将不胜感激!谢谢!
编辑: 仅使用设置搜索栏框架或给它自动布局约束中的一个(而不是我最初尝试的组合)似乎首先起作用,但在点击搜索栏后,您会遇到 Dwight 指出的问题。我已经留下了这些案例的代码,以防与您当前拥有的代码进行比较会有所帮助,但对于有效的解决方案,请参阅下面的答案。
使用自动布局约束:
let searchController = UISearchController(searchResultsController: nil)
let topConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: (statusBarHeight + navigationBarHeight!))
let leftConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Left, multiplier: 1, constant: 0)
let rightConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Right, multiplier: 1, constant: 0)
let heightConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 44)
searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(false)
searchController.searchBar.addConstraint(heightConstraint)
self.view.addSubview(searchController.searchBar)
self.view.addConstraints([topConstraint, leftConstraint, rightConstraint])
我已将 topConstraint 常量设置为状态栏的高度加上导航栏的高度,因为我的视图控制器嵌入在导航控制器中。
调整框架:
let searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.frame = CGRect(x: 0, y: (statusBarHeight + navigationBarHeight!), width: self.view.frame.size.width, height: 44)
self.view.addSubview(searchController.searchBar)
试试这个:
let searchController = UISearchController(searchResultsController: nil).searchBar
// Set the search bar's frame
searchController.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 50)
// Constraint to pin the search bar to the top of the view
let topConstraint = NSLayoutConstraint(item: searchController, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)
// searchController.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(searchController)
// self.presentViewController(searchController, animated: true, completion: nil)
self.view.addConstraint(topConstraint)
或者您可以这样做:
searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(false)
-> searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(true)
经过反复试验,我有以下可行的解决方案:
- 打开 Main.storyboard 并向您的视图控制器添加一个高度为 44(UISearchBar 的默认高度)的 UIView 和一个 UITableView。设置自动布局约束,以便将 UIView 固定到两侧和顶部布局指南(使用顶部布局指南确保无论您的视图控制器是否嵌入导航控制器中,这都有效)和 table视图固定在两侧,底部布局指南,其顶部固定在 UIView 的底部。
- 在您的 ViewController.swift 中将 UIView 和 UITableView 连接为 IBOutlets。在我的项目中,我称它们为 topView 和 tableView.
- 在 ViewController.swift 的顶部声明一个搜索控制器:
var searchController: UISearchController!
然后,在viewDidLoad()中,你需要:
// Initialize and set up the search controller self.searchController = UISearchController(searchResultsController: nil) self.searchController.searchResultsUpdater = self self.searchController.dimsBackgroundDuringPresentation = false // Optional self.searchController.searchBar.delegate = self // Add the search bar as a subview of the UIView you added above the table view self.topView.addSubview(self.searchController.searchBar) // Call sizeToFit() on the search bar so it fits nicely in the UIView self.searchController.searchBar.sizeToFit() // For some reason, the search bar will extend outside the view to the left after calling sizeToFit. This next line corrects this. self.searchController.searchBar.frame.size.width = self.view.frame.size.width
应该是这个!当然,您需要使您的视图控制器成为 UITableViewDatasource、UITableViewDelegate、UISearchBarDelegate、UISearchControllerDelegate 和 UISearchResultsUpdating 并处理所有必需的委托方法,但就搜索栏而言,这对我有用。有问题请评论