激活搜索栏不会隐藏导航栏

时间:2013-10-13 18:39:20

标签: ios objective-c xcode ios7 uisearchbar

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

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

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

Each [] is a view controller

当我启动我的应用程序时,我会看到Tab Item 1UISearchBar,如下面的屏幕截图所示:

one

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

two

当我从故事板中删除Tab Bar Controller并将Navigation Controller直接连接到Tab Item #1时,导航栏会按预期隐藏。

点击搜索栏时如何隐藏导航栏?有关我希望重现的功能的示例,请单击默认iOS7“电话”应用程序的“联系人”选项卡下的搜索栏。

7 个答案:

答案 0 :(得分: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);
    }];
}

答案 1 :(得分:4)

对于 swift 开发者:

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { 

  navigationController?.setNavigationBarHidden(true, animated: true)

}

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) { 

  navigationController?.setNavigationBarHidden(false, animated: true)

}

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

答案 2 :(得分:2)

您可以将导航控制器中的顶部栏设置为无,然后将其添加到tabBarController代码中:

self.navigationController.navigationBar.translucent= NO;

在viewDidLoad方法

答案 3 :(得分: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的类型并在其中实现该代码。

答案 4 :(得分:0)

以下行将在激活搜索栏时动态隐藏导航栏。

self.searchController.hidesNavigationBarDuringPresentation = true

答案 5 :(得分:-1)

我意识到这可能为时已晚,无法帮助你,但今天我遇到了同样的问题!

我通过修复搜索栏的约束来解决它。确保搜索栏的直接顶级邻居(导航栏)的约束为0px。还要确保搜索栏下方的tableview对其直接顶级邻居(搜索栏)的约束为0px。

不确定您面临的确切问题,但是我已经解决了这个问题。

答案 6 :(得分:-1)

我通过在搜索栏上添加约束来解决问题,并将其值设置为0并向搜索栏添加垂直间距约束并将其值设置为0;