2013-10-13 19 views
6

検索バー(UISearchBar)をタップすると、奇妙な動作をするiOS 7アプリケーションがXCode 5.0にあります。検索バーを有効にしてもナビゲーションバーが表示されない

私のアプリケーションには、ナビゲーションコントローラとタブバーコントローラがあります。ここに私のMain.Storyboardがどのように見えるかの例である:私は自分のアプリケーションを起動すると

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

Each [] is a view controller 

次のスクリーンショットに示すように、私はUISearchBarTab Item 1を参照してください。

one

UISearchBarをタップすると、検索バーが画面の上部までスライドしますが、ナビゲーションバーは非表示にならず、ビューは「スライドアップ」しません。私はストーリーボードからTab Bar Controllerを削除し、期待通りにナビゲーションバーが非表示になりますTab Item #1に直接Navigation Controllerを接続する場合

two

:これはアプリはこのように見えるようになります。

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

+1

本当にナビゲーションコントローラにタブバーコントローラが含まれていますか?一般的にそれは逆です。 –

+0

@nevanking - 私はそれを他の方法でやろうとしていましたが、動作させることができませんでした。ナビゲーションバーは、「Tab Item#1」ビューだけでなく、アプリケーション全体にまたがる必要があります。他の方法を切り替える理由は何ですか? – Ian

+1

それはもっと普通のやり方です。音楽アプリや時計アプリを見てください。各タブに独自のナビゲーションコントローラを与え、コンテンツビューコントローラが含まれていると考えるかもしれません。 –

答えて

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); 
    }]; 
} 
+0

私はそれを迅速に行うことができますか? – mumu

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のタイプとして作成し、そのコードを実装することを忘れないでください。

+0

また、http://stackoverflow.com/questions/19932192/issue-with-uisearchbar-and-uitableview-in-ios7/20091672#20091672を参照してください。 –

2

あなたは誰にも負けない、リストのためのナビゲーションコントローラ内の上部のバーを設定してからごtabBarControllerコードにこれを追加することができます。私はこれはおそらくであることを認識

-1

viewDidLoadメソッドで

self.navigationController.navigationBar.translucent= NO; 

あなたを助けるには遅すぎますが、私は今日同じ問題に遭遇しました!

検索バーの制約を修正して解決しました。検索バーのすぐ上の隣(ナビゲーションバー)に0pxの制約があることを確認します。また、検索バーの下にあるテーブルビューに、そのすぐ上の隣(検索バー)の制約が0pxであることを確認します。

あなたが直面していた正確な問題はわかりませんが、それは私のために修正されました。

-1

検索バーをトップレイアウトガイドに追加してその値を0に設定して問題を解決し、検索バーに垂直スペーシング制約を追加してその値を0に設定しました。 迅速開発者にとって

3

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { 

    navigationController?.setNavigationBarHidden(true, animated: true) 

} 

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) { 

    navigationController?.setNavigationBarHidden(false, animated: true) 

} 

これは検索バーがアクティブな状態でナビゲーションバーを非表示と検索バーが非アクティブのとき、再びそれを表示します。

関連する問題