【问题标题】:Activating search bar doesn't hide navigation bar激活搜索栏不会隐藏导航栏
【发布时间】:2013-10-21 08:16:25
【问题描述】:

我在 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,如下面的屏幕截图所示:

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

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

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

【问题讨论】:

  • 您真的希望导航控制器包含标签栏控制器吗?通常情况正好相反。
  • @nevanking - 我曾尝试以另一种方式进行操作,但无法使其正常工作。导航栏应该跨越整个应用程序,而不仅仅是Tab Item #1 视图。换个方向的原因是什么?
  • 这只是更正常的做法。查看音乐应用程序或时钟应用程序。您可能会考虑为每个选项卡提供自己的导航控制器,然后包含内容视图控制器。

标签: ios objective-c xcode ios7 uisearchbar


【解决方案1】:

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

self.searchController.hidesNavigationBarDuringPresentation = true

【讨论】:

    【解决方案2】:

    对于 swift 开发人员:

    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { 
    
      navigationController?.setNavigationBarHidden(true, animated: true)
    
    }
    
    func searchBarTextDidEndEditing(_ searchBar: UISearchBar) { 
    
      navigationController?.setNavigationBarHidden(false, animated: true)
    
    }
    

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

    【讨论】:

      【解决方案3】:

      我通过将 Search Bar 上的约束添加到 Top Layout Guide 并将其值设置为 0 并将垂直间距约束添加到 Search Bar 并将其值设置为 0 来解决问题;

      【讨论】:

        【解决方案4】:

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

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

        不确定您所面临的确切问题,但这已为我解决了。

        【讨论】:

          【解决方案5】:

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

          self.navigationController.navigationBar.translucent= NO;
          

          在 viewDidLoad 方法中

          【讨论】:

            【解决方案6】:

            你可以用 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 类型并在其中实现该代码。

            【讨论】:

            【解决方案7】:

            您可以使用 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);
                }];
            }
            

            【讨论】:

            • 我怎样才能快速做到这一点?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多