在 iOS 11 上不滚动而在导航栏中显示搜索栏
Show search bar in navigation bar without scrolling on iOS 11
我将 UISearchController 附加到 iOS 11 上的 UITableViewController 的 navigationItem.searchController
属性。这很好用:我可以使用漂亮的 iOS 11-样式搜索栏。
不过,我想让搜索栏在启动时可见。默认情况下,用户必须在 table 视图中向上滚动才能看到搜索栏。有谁知道这怎么可能?
左:启动后的默认情况。右:搜索栏可见(通过向上滚动)。我想让搜索栏在启动后可见,如右图所示。
我已经发现通过将导航项的 属性 hidesSearchBarWhenScrolling
设置为 false 可以使搜索栏可见。但是,这会导致搜索栏始终可见 - 即使向下滚动 - 这不是我想要的。
您可以在将 searchController 添加到 navigationItem
后将 属性 isActive
设置为 true
。
就像这样:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
searchController.isActive = true
}
以下内容首先使搜索栏可见,然后在滚动时允许它隐藏:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if #available(iOS 11.0, *) {
navigationItem.hidesSearchBarWhenScrolling = false
}
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if #available(iOS 11.0, *) {
navigationItem.hidesSearchBarWhenScrolling = true
}
}
使用 isActive
没有达到我想要的效果,它使搜索栏处于活动状态(显示取消按钮等),而我只想让它可见。
对我来说,在 viewDidLoad()
方法中添加以下行后它就起作用了:
navigationController?.navigationBar.prefersLargeTitles = true
navigationController!.navigationBar.sizeToFit()
在 iOS 13 日,@Jordan Wood 的回答无效。
相反,我做了:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
UIView.performWithoutAnimation {
searchController.isActive = true
searchController.isActive = false
}
}
For (iOS 13.0, *) and SwiftUI
navigationController?.navigationBar.sizeToFit()
Example:
struct SearchBarModifier: ViewModifier {
let searchBar: SearchBar
func body(content: Content) -> some View {
content
.overlay(
ViewControllerResolver { viewController in
viewController.navigationItem.searchController = self.searchBar.searchController
viewController.navigationController?.navigationBar.sizeToFit()
}
.frame(width: 0, height: 0)
)
}
}
我将 UISearchController 附加到 iOS 11 上的 UITableViewController 的 navigationItem.searchController
属性。这很好用:我可以使用漂亮的 iOS 11-样式搜索栏。
不过,我想让搜索栏在启动时可见。默认情况下,用户必须在 table 视图中向上滚动才能看到搜索栏。有谁知道这怎么可能?
左:启动后的默认情况。右:搜索栏可见(通过向上滚动)。我想让搜索栏在启动后可见,如右图所示。
我已经发现通过将导航项的 属性 hidesSearchBarWhenScrolling
设置为 false 可以使搜索栏可见。但是,这会导致搜索栏始终可见 - 即使向下滚动 - 这不是我想要的。
您可以在将 searchController 添加到 navigationItem
后将 属性 isActive
设置为 true
。
就像这样:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
searchController.isActive = true
}
以下内容首先使搜索栏可见,然后在滚动时允许它隐藏:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if #available(iOS 11.0, *) {
navigationItem.hidesSearchBarWhenScrolling = false
}
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if #available(iOS 11.0, *) {
navigationItem.hidesSearchBarWhenScrolling = true
}
}
使用 isActive
没有达到我想要的效果,它使搜索栏处于活动状态(显示取消按钮等),而我只想让它可见。
对我来说,在 viewDidLoad()
方法中添加以下行后它就起作用了:
navigationController?.navigationBar.prefersLargeTitles = true
navigationController!.navigationBar.sizeToFit()
在 iOS 13 日,@Jordan Wood 的回答无效。 相反,我做了:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
UIView.performWithoutAnimation {
searchController.isActive = true
searchController.isActive = false
}
}
For (iOS 13.0, *) and SwiftUI
navigationController?.navigationBar.sizeToFit()
Example:
struct SearchBarModifier: ViewModifier {
let searchBar: SearchBar
func body(content: Content) -> some View {
content
.overlay(
ViewControllerResolver { viewController in
viewController.navigationItem.searchController = self.searchBar.searchController
viewController.navigationController?.navigationBar.sizeToFit()
}
.frame(width: 0, height: 0)
)
}
}