Примечание 1. Этот вопрос относится к добавлению панели поиска UISearchController за пределы обновляемого табличного представления, а НЕ в качестве заголовка табличного представления.
Примечание 2. Путем проб и ошибок я нашел решение. См. мой ответ ниже.
Я новичок в разработке iOS и изо всех сил пытаюсь работать с классом UISearchController. У меня есть контроллер представления, и в представлении моего контроллера представления я планирую иметь панель поиска над табличным представлением. Я хотел бы, чтобы панель поиска была связана с 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)
Любая помощь будет принята с благодарностью! Благодарю вас!
РЕДАКТИРОВАТЬ: Использование только одного из вариантов настройки рамки панели поиска или установки ограничений автомакета (в отличие от комбинации того и другого, как я изначально пытался) сначала работает, но после нажатия на панель поиска у вас будут проблемы, как указал Дуайт. Я оставил код для этих случаев на случай, если будет полезно сравнить с тем, что у вас есть в настоящее время, но для рабочего решения см. Мой ответ ниже.
Использование ограничений автомакета:
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)