如何用 UISearchBar 替换导航栏?
Posted
技术标签:
【中文标题】如何用 UISearchBar 替换导航栏?【英文标题】:How to replace the navigation bar with an UISearchBar? 【发布时间】:2020-02-28 12:29:16 【问题描述】:我想在显示后用搜索栏替换导航栏。
或
如果导航栏总是超过我的主视图控制器的内容,我会很好。
我像这样设置搜索控制器:
_searchController = [[UISearchController alloc] initWithSearchResultsController:[[MySearchViewController alloc] init]];
_searchController.delegate = self;
_searchController.obscuresBackgroundDuringPresentation = TRUE;
_searchController.hidesNavigationBarDuringPresentation = TRUE;
_searchController.searchBar.placeholder = @"Search...";
_searchController.searchBar.delegate = self;
我像这样显示搜索控制器:
- (void)searchButtonTapped:(id)sender
self.navigationItem.searchController = _searchController;
[self.navigationController.view setNeedsLayout];
[self.navigationController.view layoutIfNeeded];
[self.navigationItem.searchController.searchBar becomeFirstResponder];
我像这样隐藏搜索控制器:
- (void)willDismissSearchController:(UISearchController*)searchController
self.navigationItem.searchController = nil;
[self.navigationController.view setNeedsLayout];
我知道searchController.hidesNavigationBarDuringPresentation
的属性与我想要的很接近,但正是如此。因为导航栏只有在我进入搜索栏后才会隐藏,但我希望它在我呈现搜索栏时已经隐藏。
只要我按下导航栏中的搜索图标按钮,它就会被搜索控制器替换,并且只有搜索栏在顶部可见。有谁知道如何做到这一点?
我已经试过了:
当我用[self.navigationController setNavigationBarHidden:YES animated:NO];
显示搜索控制器时隐藏导航栏
控制搜索栏高度限制并根据可见性进行更改
将搜索控制器设置为navigationItem.titleView
-> 这不是我想要的
根据可见性隐藏搜索控制器 -> 导航栏保持相同高度,仅隐藏搜索控制器
使用self.definesPresentationContext
,但这似乎与我需要的设置不同
查看了self.navigationItem.hidesSearchBarWhenScrolling
,但这并不适用,因为我不使用表格视图控制器
【问题讨论】:
【参考方案1】:我可以做我的第一个选择
我想在显示后用搜索栏替换导航栏。
工作。
当 UISearchBar 显示时,我使用了显示和隐藏导航项的左右 bat 按钮项的方法。
如果有更简单的方法来达到同样的效果,我会感兴趣吗?
@interface MyViewController() <UISearchControllerDelegate, SearchDelegate>
@end
@implementation MyViewController
UIView* _navigationItemTitleView;
NSArray<UIBarButtonItem*>* _leftBarButtonItems;
NSArray<UIBarButtonItem*>* _rightBarButtonItems;
- (void)viewDidLoad
_searchController = [[UISearchController alloc] initWithSearchResultsController:[[MySearchViewController alloc] init]];
// ....
_navigationItemTitleView = self.navigationItem.titleView;
_leftBarButtonItems = self.navigationItem.leftBarButtonItems;
_rightBarButtonItems = self.navigationItem.rightBarButtonItems;
- (void)searchButtonTapped:(id)sender
// show the search bar in the navigation item
self.navigationItem.leftBarButtonItems = nil;
self.navigationItem.rightBarButtonItems = nil;
self.navigationItem.titleView = _searchController.searchBar;
_searchController.active = TRUE;
- (void)willDismissSearchController:(UISearchController*)searchController
// hide the search bar and restore previous state of the navigation item
self.navigationItem.leftBarButtonItems = _leftBarButtonItems;
self.navigationItem.rightBarButtonItems = _rightBarButtonItems;
self.navigationItem.titleView = _navigationItemTitleView;
【讨论】:
以上是关于如何用 UISearchBar 替换导航栏?的主要内容,如果未能解决你的问题,请参考以下文章
编辑时如何用导航控制器中的另一个 UIBarButtonItem 替换后退按钮?