在表格视图中搜索栏为 header - 出现和消失
Search bar as header in tableview - appear and disappear
我需要在 table 视图的顶部放置一个搜索栏。我正在进行网络调用,当结果大于 100 时,我希望搜索栏出现,当结果小于 100 时,我不想搜索栏出现。 table视图位于VC的右侧,并没有占据整个视图控制器。我希望搜索栏作为 header 位于 table 视图的顶部。
我不能使用搜索控制器,因为在 iOS 11 中,使用搜索控制器会使搜索栏在 VC 处于活动状态时弹出到顶部。
我试图将 tableviewheader 设置为 nil 以使其消失。但是我显然无法取回它,因为我将 header 设置为零。
self.rightDetailFilterTableView.tableHeaderView = nil
self.rightDetailFilterTableView.sectionHeaderHeight = 0
我已将搜索栏放入情节提要中,如下图所示。这是将搜索栏添加为 header 的正确方法吗?
让它在 table 视图中出现和消失的最佳方法是什么?我尝试了很多不同的方法。他们要么留空header,要么做其他导致问题的事情。我也尝试使用 header 委托方法,但仍然无效。
我没有使用 table 视图控制器,我使用的是普通的 VC。我也没有使用搜索栏控制器,因为它会导致 iOS 11.
这是我在最近的一个项目中所做的。首先,阐述一下我的观点:
也就是说,搜索栏被添加到父视图而不是 table 视图。这允许我根据需要 hide/show 它。
接下来,我定义了两个可选的布局约束,一个确保 tableview 与安全区域的顶部对齐,优先级 750;另一个将搜索栏的顶部与安全区域的顶部对齐;低于 750 的优先级将其隐藏在导航栏下方或高于 750 的优先级将其显示并将 table 视图向下推。
在代码中,我为安全区域顶部的搜索栏的布局约束创建了一个@IBOutlet,并根据需要更改其优先级:
@IBAction
func toggleSearchBar(_ sender: Any?) {
if searchBarVisibleLayoutConstraint.priority.rawValue > 750.0 {
searchBarVisibleLayoutConstraint.priority = UILayoutPriority(rawValue: 1.0)
searchBar?.endEditing(true)
} else {
searchBarVisibleLayoutConstraint.priority = UILayoutPriority(rawValue: 999.0)
}
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}
}
在我的例子中,导航栏是不透明的,搜索栏在它后面不可见。您的情况可能有所不同,因此您可能还想剪裁父视图或在搜索栏不可见时对其进行 alpha 淡入淡出。
祝你好运!
请检查:
为我的 SearchBar
创建了 IBOutlet。
@IBOutlet weak var testbar: UISearchBar!
在我的 viewDidLoad
中:
override func viewDidLoad() {
var contentOffset = tableView.contentOffset
let showSearchBar = (results.count > 100)
self.tableView.tableHeaderView?.isHidden = !(showSearchBar)
if showSearchBar {
contentOffset.y -= testbar.frame.size.height
} else {
contentOffset.y += testbar.frame.size.height
}
tableView.contentOffset = contentOffset
}
这是我的 tableview 故事板
我需要在 table 视图的顶部放置一个搜索栏。我正在进行网络调用,当结果大于 100 时,我希望搜索栏出现,当结果小于 100 时,我不想搜索栏出现。 table视图位于VC的右侧,并没有占据整个视图控制器。我希望搜索栏作为 header 位于 table 视图的顶部。
我不能使用搜索控制器,因为在 iOS 11 中,使用搜索控制器会使搜索栏在 VC 处于活动状态时弹出到顶部。
我试图将 tableviewheader 设置为 nil 以使其消失。但是我显然无法取回它,因为我将 header 设置为零。
self.rightDetailFilterTableView.tableHeaderView = nil
self.rightDetailFilterTableView.sectionHeaderHeight = 0
我已将搜索栏放入情节提要中,如下图所示。这是将搜索栏添加为 header 的正确方法吗?
让它在 table 视图中出现和消失的最佳方法是什么?我尝试了很多不同的方法。他们要么留空header,要么做其他导致问题的事情。我也尝试使用 header 委托方法,但仍然无效。
我没有使用 table 视图控制器,我使用的是普通的 VC。我也没有使用搜索栏控制器,因为它会导致 iOS 11.
这是我在最近的一个项目中所做的。首先,阐述一下我的观点:
也就是说,搜索栏被添加到父视图而不是 table 视图。这允许我根据需要 hide/show 它。
接下来,我定义了两个可选的布局约束,一个确保 tableview 与安全区域的顶部对齐,优先级 750;另一个将搜索栏的顶部与安全区域的顶部对齐;低于 750 的优先级将其隐藏在导航栏下方或高于 750 的优先级将其显示并将 table 视图向下推。
在代码中,我为安全区域顶部的搜索栏的布局约束创建了一个@IBOutlet,并根据需要更改其优先级:
@IBAction
func toggleSearchBar(_ sender: Any?) {
if searchBarVisibleLayoutConstraint.priority.rawValue > 750.0 {
searchBarVisibleLayoutConstraint.priority = UILayoutPriority(rawValue: 1.0)
searchBar?.endEditing(true)
} else {
searchBarVisibleLayoutConstraint.priority = UILayoutPriority(rawValue: 999.0)
}
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}
}
在我的例子中,导航栏是不透明的,搜索栏在它后面不可见。您的情况可能有所不同,因此您可能还想剪裁父视图或在搜索栏不可见时对其进行 alpha 淡入淡出。
祝你好运!
请检查:
为我的 SearchBar
创建了 IBOutlet。
@IBOutlet weak var testbar: UISearchBar!
在我的 viewDidLoad
中:
override func viewDidLoad() {
var contentOffset = tableView.contentOffset
let showSearchBar = (results.count > 100)
self.tableView.tableHeaderView?.isHidden = !(showSearchBar)
if showSearchBar {
contentOffset.y -= testbar.frame.size.height
} else {
contentOffset.y += testbar.frame.size.height
}
tableView.contentOffset = contentOffset
}
这是我的 tableview 故事板