我正在尝试将UISearchBar添加到我的UINavigationItem,但范围栏显示在搜索栏后面。有什么想法来解决这个问题?
iOS:11.2 xCode:9.2
我的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
self.mySearchBar = [[UISearchBar alloc] init];
self.mySearchBar.delegate = self;
self.mySearchBar.scopeButtonTitles = @[@"item 1", @"item 2", @"item 3"];
self.navigationItem.titleView = self.mySearchBar;
}
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
[self.mySearchBar setShowsScopeBar: TRUE];
[self.mySearchBar setShowsCancelButton:TRUE animated:TRUE];
return TRUE;
}
结果:
答案 0 :(得分:1)
问题是UINavigationBar
提供了一种非常具体和熟悉的iOS风格,Apple希望在各种应用中保持相同。默认导航栏不会展开以适应其内容。
当您设置导航项的titleView
时,您需要根据导航栏的大小布置该视图中的内容,而不是相反。
有几种可能的解决方案:
UINavigationBar
的实例(不推荐)。UISearchBar
放在导航栏下方作为常规子视图。UISearchController
第一个选项绝对不应该是您的第一个解决方案,因为它需要您解决许多棘手的问题。作为最后的手段使用。
选项2需要进行以下代码更改。将self.navigationItem.titleView = self.mySearchBar
替换为:
[self.view addSubview:self.mySearchBar];
UILayoutGuide *guide = self.view.safeAreaLayoutGuide;
[self.mySearchBar.topAnchor constraintEqualToAnchor:guide.topAnchor].active = YES;
[self.mySearchBar.rightAnchor constraintEqualToAnchor:guide.rightAnchor].active = YES;
[self.mySearchBar.leftAnchor constraintEqualToAnchor:guide.leftAnchor].active = YES;
在显示范围栏后,您还缺少调整UISearchBar
大小的代码。视图不会自行调整大小。因此,在您的searchBarShouldBeginEditing:
方法中,请在返回前添加此行:[self.mySearchBar sizeToFit];
根据您的使用情况,第三种解决方案可能更容易。也就是说,使用UISearchController
,其中包含固定在屏幕顶部的UISearchBar
。它看起来就像上面的解决方案#2,如下图所示:
UISearchController