启用搜索栏不会隐藏导航栏

8
我是一名有用的助手,能够翻译文本。

我在XCode 5.0中拥有一个iOS 7应用程序,当点击搜索栏(UISearchBar)时会出现一些奇怪的行为。

我的应用程序有一个导航控制器和一个选项卡控制器。以下是Main.Storyboard的示例:

[Navigation Controller] -> [Tab Bar Controller] -> [Tab Item #1]
                                    |
                                    -------------> [Tab Item #2]

Each [] is a view controller

当我启动我的应用程序时,我会看到如下截图所示的带有UISearchBarTab Item 1

one

当我点击 UISearchBar 时,搜索栏会滑动到屏幕顶部,但导航栏不会隐藏,视图也不会“上滑”。这会导致应用程序看起来像这样:

two

当我从storyboard中删除Tab Bar Controller并将Navigation Controller直接连接到Tab Item #1时,导航栏会按预期隐藏。
如何在点击搜索栏时隐藏导航栏?要查看我想要复制的功能示例,请单击默认iOS7“电话”应用程序下“联系人”选项卡中的搜索栏。

1
你真的想让导航控制器包含标签栏控制器吗?通常情况是反过来的。 - nevan king
@nevanking - 我尝试过用另一种方式实现,但无法使其正常工作。导航栏应跨越整个应用程序,而不仅仅是“选项卡项目1”视图。改为另一种方式的原因是什么? - Ian
1
这只是更正常的做法。看看音乐应用程序或时钟应用程序。您可以考虑为每个选项卡提供自己的导航控制器,然后包含内容视图控制器。 - nevan king
7个回答

5

针对 Swift 开发者:

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { 

  navigationController?.setNavigationBarHidden(true, animated: true)

}

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) { 

  navigationController?.setNavigationBarHidden(false, animated: true)

}

当搜索栏处于激活状态时,这将隐藏导航栏,并在搜索栏不活动时再次显示它。

4
以下代码将在激活搜索栏时动画隐藏导航栏。
self.searchController.hidesNavigationBarDuringPresentation = true

4
您可以使用UISearchBar委托方法来决定何时将导航栏移出屏幕。
-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
    [UIView animateWithDuration:0.2 animations:^{
        CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
        double yDiff = self.navigationController.navigationBar.frame.origin.y - self.navigationController.navigationBar.frame.size.height - statusBarFrame.size.height;
        self.navigationController.navigationBar.frame = CGRectMake(0, yDiff, 320, self.navigationController.navigationBar.frame.size.height);
    }];

}

-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{
    [UIView animateWithDuration:0.2 animations:^{
        CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
        double yDiff = self.navigationController.navigationBar.frame.origin.y + self.navigationController.navigationBar.frame.size.height + statusBarFrame.size.height;
        self.navigationController.navigationBar.frame = CGRectMake(0, yDiff, 320, self.navigationController.navigationBar.frame.size.height);
    }];
}

我可以用Swift如何做到这一点? - Rubaiyat Jahan Mumu

2

您可以在导航控制器中将列表的顶部栏设置为none,然后将以下代码添加到您的tabBarController代码中:

self.navigationController.navigationBar.translucent= NO;

在viewDidLoad方法中。

1

你可以使用UISearchDisplayController方法来实现;

-(void)searchDisplayControllerWillBeginSearch:(mySearchDisplayController *)controller
{
    self.searchResultsDataSource = self;
    self.searchResultsTableView.delegate = self;
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
    {
        CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
        [UIView animateWithDuration:0.01 animations:^{
            for (UIView *subview in self.searchBar.subviews)
                subview.transform = CGAffineTransformMakeTranslation(0, statusBarFrame.size.height);
        }];
    }
}

-(void)searchDisplayControllerWillEndSearch:(mySearchDisplayController *)controller
{
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
    {
        [UIView animateWithDuration:0.01 animations:^{
            for (UIView *subview in self.searchBar.subviews)
                subview.transform = CGAffineTransformIdentity;
        }];
    }
}

不要忘记创建一个作为UISearchDisplayController类型的新类,并在其中实现该代码。

另外,您也应该想要查看 http://stackoverflow.com/questions/19932192/issue-with-uisearchbar-and-uitableview-in-ios7/20091672#20091672 - Kemal Can Kaynak

0

我通过在搜索栏上添加约束条件并将其值设置为0,以及在搜索栏上添加垂直间距约束条件并将其值设置为0来解决了这个问题。


-1

我知道现在可能已经太晚了,无法帮助你,但今天我也遇到了同样的问题!

我通过修复搜索栏的约束来解决它。确保搜索栏对其直接顶部邻居(导航栏)有0像素的约束。还要确保搜索栏下面的表视图对其直接顶部邻居(搜索栏)有0像素的约束。

不确定你遇到的确切问题是什么,但这个方法对我有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接