В то время как другие ответы кажутся полезными и частично выполняют свою работу, это не решает проблему с тем, что панель поиска не получает прикосновения пользователя, потому что она перемещается за пределы родительского представления при изменении его фрейма.* Хуже того, когда вы нажимаете на панель поиска, чтобы сделать ее первым респондентом, весьма вероятно, что делегат tableView вызовет tableView:didSelectRowAtIndexPath:
в ячейке, расположенной под панелью поиска.
Для решения этих проблем, описанных выше, вам нужно обернуть панель поиска в простой UIView, вид, который способен обрабатывать касания, произошедшие за пределами его границ.Таким образом, вы можете передать эти прикосновения к панели поиска.
Итак, давайте сделаем это сначала:
class SearchBarView: UIView {
override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
for subview in subviews {
if !subview.userInteractionEnabled { continue }
let newPoint = subview.convertPoint(point, fromView: self)
if CGRectContainsPoint(subview.bounds, newPoint) {
return subview.hitTest(newPoint, withEvent: event)
}
}
return super.hitTest(point, withEvent: event)
}
}
Прямо сейчас у нас есть подкласс UIView с именем SearchBarView
, который способен принимать касания, произошедшие за пределами его границ.
Во-вторых, мы должны поместить панель поиска в это новое представление, пока контроллер представления загружает его:
class TableViewController: UITableViewController {
private let searchBar = UISearchBar(frame: CGRectZero)
...
override func viewDidLoad() {
super.viewDidLoad()
...
searchBar.sizeToFit()
let searchBarView = SearchBarView(frame: searchBar.bounds)
searchBarView.addSubview(searchBar)
tableView.tableHeaderView = searchBarView
}
}
Наконец, мы должны обновить фрейм панели поиска как пользовательпрокручивает представление таблицы вниз, чтобы оно оставалось фиксированным сверху:
override func scrollViewDidScroll(scrollView: UIScrollView) {
searchBar.frame.origin.y = max(0, scrollView.contentOffset.y)
}
Вот результат:
-
Важное примечание: если в вашем табличном представлении есть разделы, они, вероятно, будут затенять вашу панель поиска, поэтому вам нужно ставить панель поиска поверх них при каждом обновлении bounds
табличного представления.
viewDidLayoutSubviews
- хорошее место для этого:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
...
if let tableHeaderView = tableView.tableHeaderView {
tableView.bringSubviewToFront(tableHeaderView)
}
}
-
Надеждаэто помогает.Вы можете скачать пример проекта с здесь .