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

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

一

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

二

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

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

4

7 回答 7

5

对于swift开发人员:

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { 

  navigationController?.setNavigationBarHidden(true, animated: true)

}

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) { 

  navigationController?.setNavigationBarHidden(false, animated: true)

}

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

于 2017-02-03T12:10:50.357 回答
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);
    }];
}
于 2013-11-19T16:44:18.740 回答
4

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

self.searchController.hidesNavigationBarDuringPresentation = true
于 2018-04-17T09:16:49.967 回答
2

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

self.navigationController.navigationBar.translucent= NO;

在 viewDidLoad 方法中

于 2013-12-11T11:07:19.783 回答
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 类型并在其中实现该代码。

于 2013-11-20T09:25:37.457 回答
0

我通过将搜索栏上的约束添加到顶部布局指南并将其值设置为 0 并将垂直间距约束添加到搜索栏并将其值设置为 0 来解决问题;

于 2014-03-26T17:52:22.917 回答
-1

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

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

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

于 2014-02-24T16:45:35.290 回答