UINavigationBar / UINavigationItem中的UISearchBar范围按钮

时间:2018-01-07 18:06:11

标签: ios objective-c xcode uisearchbar uinavigationitem

我正在尝试将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;
}   

结果:

enter image description here

1 个答案:

答案 0 :(得分:1)

上下文

问题是UINavigationBar提供了一种非常具体和熟悉的iOS风格,Apple希望在各种应用中保持相同。默认导航栏不会展开以适应其内容。

当您设置导航项的titleView时,您需要根据导航栏的大小布置该视图中的内容,而不是相反。

解决方案

有几种可能的解决方案:

  1. Change the behavior UINavigationBar的实例(不推荐)。
  2. UISearchBar放在导航栏下方作为常规子视图。
  3. 使用UISearchController
  4. 第一个选项绝对不应该是您的第一个解决方案,因为它需要您解决许多棘手的问题。作为最后的手段使用。

    选项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,如下图所示:

    enter image description here

    如果您有兴趣,请使用UISearchController

    Here is a great tutorial