2013-10-13 18 views
6

Mam aplikację iOS 7 w kodzie XCode 5.0, która wykazuje dziwne zachowanie po dotknięciu paska wyszukiwania (UISearchBar).Aktywacja paska wyszukiwania nie powoduje ukrycia paska nawigacji

Moja aplikacja zawiera kontroler nawigacyjny i kontroler paska kart. Oto przykład tego, co mój Main.Storyboard wygląda następująco:

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

Each [] is a view controller 

Kiedy uruchomić mój wniosek, widzę Tab Item 1 z UISearchBar jak pokazano na poniższym zrzucie ekranu:

one

Kiedy Wybieram UISearchBar, pasek wyszukiwania przesuwa się na górę ekranu, ale pasek nawigacji nie ukrywa się, a widok nie "przesuwa się". To powoduje, że aplikację wyglądać następująco:

two

Kiedy usunąć Tab Bar Controller z serii ujęć, a następnie podłącz Navigation Controller bezpośrednio Tab Item #1 pasek nawigacyjny ukrywa, jak oczekiwano.

Jak ukryć pasek nawigacji po dotknięciu paska wyszukiwania? Aby zobaczyć przykład funkcji, którą zamierzam odtworzyć, kliknij pasek wyszukiwania na karcie "Kontakty" w domyślnej aplikacji "Telefon" na iOS7.

+1

Czy naprawdę chcesz, aby kontroler nawigacyjny zawierał kontroler paska kart? Zasadniczo jest odwrotnie. –

+0

@nevanking - Próbowałem zrobić to w inny sposób i nie mogłem go uruchomić. Pasek nawigacyjny powinien obejmować całą aplikację, a nie tylko widok "Tab. Nr 1". Jakie jest uzasadnienie zmiany na odwrót? – Ian

+1

To po prostu bardziej normalny sposób na zrobienie tego. Spójrz na aplikację Muzyka lub aplikację Zegar. Możesz myśleć o nadaniu każdej karcie własnego kontrolera nawigacyjnego, który następnie zawiera kontroler widoku treści. –

Odpowiedz

4

Możesz użyć metod delegatów UISearchBar, aby zdecydować, kiedy przenieść pasek nawigacji poza ekran.

-(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

Jak mogę to zrobić w szybkim tempie? – mumu

1

Możesz to zrobić za pomocą metody 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; 
     }]; 
    } 
} 

Nie zapomnij utworzyć nową klasę jako typ UISearchDisplayController i zaimplementuj w nim kod.

+0

Powinieneś również zobaczyć, że http://stackoverflow.com/questions/19932192/issue-with-uisearchbar-and-uitableview-in-ios7/20091672#20091672 –

2

Można ustawić górny pasek w kontrolerze nawigacyjnym listy, aby nikt, a następnie dodać do tego kodu TabBarController:

self.navigationController.navigationBar.translucent= NO; 

W metodzie viewDidLoad

-1

Zdaję sobie sprawę, że jest to prawdopodobnie zbyt późno, aby ci pomóc, ale dzisiaj wpadłem na ten sam problem!

Rozwiązałem go, ustalając ograniczenia paska wyszukiwania. Upewnij się, że pasek wyszukiwania ma ograniczenie 0px dla jego najbliższego najbliższego sąsiada (pasek nawigacji). Upewnij się również, że widok tabeli pod paskiem wyszukiwania ma ograniczenie 0px dla najbliższego najbliższego sąsiada (paska wyszukiwania).

Nie jestem pewien dokładnie problemu, z którym miałeś do czynienia, ale to naprawiło to dla mnie.

-1

Rozwiązałem problem przez dodanie ograniczenia na pasku wyszukiwania do Przewodnika po topografii i ustawiłem jego wartość na 0 oraz dodałem pionowe ograniczenie odstępu do paska wyszukiwania i ustawienie jego wartości na 0;

3

Dla Swift deweloperzy:

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { 

    navigationController?.setNavigationBarHidden(true, animated: true) 

} 

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) { 

    navigationController?.setNavigationBarHidden(false, animated: true) 

} 

To będzie ukryć pasek nawigacji podczas pasek wyszukiwania jest aktywny i pokazać go ponownie, gdy pasek wyszukiwania jest nieaktywna.

Powiązane problemy