8

XCode 5.0 に iOS 7 アプリケーションがあり、検索バー ( UISearchBar) をタップすると奇妙な動作を示します。

私のアプリケーションには、Navigation Controller と Tab Bar Controller があります。これは私の Main.Storyboard がどのように見えるかの例です:

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

Each [] is a view controller

アプリケーションを起動するTab Item 1と、UISearchBar下のスクリーンショットに示すように が表示されます。

1

をタップするUISearchBarと、検索バーが画面の一番上までスライドしますが、ナビゲーション バーは隠れず、ビューも「上にスライド」しません。これにより、アプリは次のようになります。

2

をストーリーボードから削除し、ナビゲーション バーに直接Tab Bar Controller接続すると、期待どおりに非表示になります。Navigation ControllerTab Item #1

検索バーをタップしたときにナビゲーション バーを非表示にするにはどうすればよいですか? 再現しようとしている機能の例については、デフォルトの iOS7 の「電話」アプリケーションの「連絡先」タブの下にある検索バーをクリックしてください。

4

7 に答える 7

5

迅速な開発者向け:

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 に答える
2

リストのナビゲーション コントローラーのトップ バーを none に設定し、これを 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 に答える