UI带有大标题的 SearchController,UI 解雇时行为不端
UISearchController with Large titles, UI misbehave on dismissing
我有一个 UITableViewController,它在导航栏中有一个 UISearchController。
当我点击搜索、下拉一次然后按取消时,我看到了一个奇怪的 UI 行为。
我找不到发生这种情况的任何具体原因。不是每次都重现这个问题。当导航栏有一些按钮时,它会更频繁地发生,正如您在上面的 GIF 中看到的那样。
当我返回到第一个视图控制器(它没有任何导航栏按钮)并重复相同的步骤时,该问题在极少数情况下会重现。
仅当您在具有搜索控制器的 ViewController 中下拉时,才会出现此问题。如果您使用的是结果控制器并在结果控制器中下拉,则不会重现此问题。
下面是示例应用中使用的代码。
import UIKit
class SearchViewController: UITableViewController {
lazy var resultsController = ResultsVC()
lazy var searchController = UISearchController(searchResultsController: resultsController)
override func viewDidLoad() {
super.viewDidLoad()
configureSearchController()
navigationItem.largeTitleDisplayMode = .always
navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.title = "Search VC"
}
func configureSearchController() {
navigationItem.searchController = searchController
navigationItem.hidesSearchBarWhenScrolling = true
searchController.obscuresBackgroundDuringPresentation = false
searchController.hidesNavigationBarDuringPresentation = true
searchController.searchResultsUpdater = resultsController
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
navigationController?.pushViewController(SearchViewController(), animated: true)
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 50
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
cell.textLabel?.text = "Searchable cell"
return cell
}
}
class ResultsVC: UITableViewController {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 50
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
cell.textLabel?.text = "Result cell"
return cell
}
}
extension ResultsVC: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
print(searchController.searchBar.text)
}
}
我尝试在 UISearchControllerDelegate 方法 willPresentSearchController
和 willDismissSearchController
中使用 tableView.setContentOffet
更改 tableView 的内容偏移量,但是 y 位置因每个设备而异,并且它不能成为一个通用的解决方案。
PS:大多数模拟器都不会出现这个问题。因此,请在您的手机中尝试使用相同的代码。
可以通过设置
来避免这个问题的发生
searchController.obscuresBackgroundDuringPresentation = true
这意味着用户在点击搜索后无法滚动 table 视图。但是,用户可以在显示结果控制器后滚动它。
我有一个 UITableViewController,它在导航栏中有一个 UISearchController。
当我点击搜索、下拉一次然后按取消时,我看到了一个奇怪的 UI 行为。
我找不到发生这种情况的任何具体原因。不是每次都重现这个问题。当导航栏有一些按钮时,它会更频繁地发生,正如您在上面的 GIF 中看到的那样。
当我返回到第一个视图控制器(它没有任何导航栏按钮)并重复相同的步骤时,该问题在极少数情况下会重现。
仅当您在具有搜索控制器的 ViewController 中下拉时,才会出现此问题。如果您使用的是结果控制器并在结果控制器中下拉,则不会重现此问题。
下面是示例应用中使用的代码。
import UIKit
class SearchViewController: UITableViewController {
lazy var resultsController = ResultsVC()
lazy var searchController = UISearchController(searchResultsController: resultsController)
override func viewDidLoad() {
super.viewDidLoad()
configureSearchController()
navigationItem.largeTitleDisplayMode = .always
navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.title = "Search VC"
}
func configureSearchController() {
navigationItem.searchController = searchController
navigationItem.hidesSearchBarWhenScrolling = true
searchController.obscuresBackgroundDuringPresentation = false
searchController.hidesNavigationBarDuringPresentation = true
searchController.searchResultsUpdater = resultsController
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
navigationController?.pushViewController(SearchViewController(), animated: true)
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 50
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
cell.textLabel?.text = "Searchable cell"
return cell
}
}
class ResultsVC: UITableViewController {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 50
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
cell.textLabel?.text = "Result cell"
return cell
}
}
extension ResultsVC: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
print(searchController.searchBar.text)
}
}
我尝试在 UISearchControllerDelegate 方法 willPresentSearchController
和 willDismissSearchController
中使用 tableView.setContentOffet
更改 tableView 的内容偏移量,但是 y 位置因每个设备而异,并且它不能成为一个通用的解决方案。
PS:大多数模拟器都不会出现这个问题。因此,请在您的手机中尝试使用相同的代码。
可以通过设置
来避免这个问题的发生searchController.obscuresBackgroundDuringPresentation = true
这意味着用户在点击搜索后无法滚动 table 视图。但是,用户可以在显示结果控制器后滚动它。