2009-07-03 21 views
25

Mam UITableView z UISearchBar jako tableViews.tableHeaderView. Podobnie jak nowy Mail.app, Notes.app, itp. W wersji 3.0. Chcę ukryć SearchBar, dopóki użytkownik nie przeciągnie go w jego oczach.Przewiń UITableView, aby nagłówek był niewidoczny.

Moja próba działa tylko wtedy, gdy w tableView znajduje się kilka elementów, więc tabela faktycznie chce przewinąć. Nazywam to w loadView:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
[self._tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

Wygląda jednak na to, że Apple inaczej obsługuje taki serachbar. Po rozwinięciu paska wyszukiwania nie wydaje się już być związany z tablecellami (w Notes.app, nie w Mail.app).

Ale może Apple ma odrębną metodę dla tego nowego zachowania 3.0, a ja po prostu nie mogę go znaleźć?

+0

Zamówienie kilka nowych właściwości dla 'UIViewController'. [https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1](https://developer. apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1) –

Odpowiedz

33

Może spróbujesz to w ten sposób ...

[self.tableView setContentOffset:CGPointMake(0,40)]; 
+0

Działa bezbłędnie. – OlivaresF

+1

Należy to zrobić za każdym razem po ponownym wczytaniu widoku tabeli. [self.tableView reloadData]; – Thiru

+9

Nie działa, gdy liczba wierszy jest mniejsza niż całkowita liczba wierszy pasujących do ekranu. Jakieś znane obejścia tego scenariusza? – Zorayr

25

pracował dla mnie też. Użyłem następującego:

[self.tableView setContentOffset:CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height) animated:NO]; 

do sprawdzenia wysokości paska wyszukiwania.

+1

Ładnie i prosto, chociaż dodałem animowany parametr: YES, więc popraw to wygląd. – PKCLsoft

+0

Idealny! Po prostu dodałem go w viewWillAppear i uzyskałem wynik, którego szukałem. – anasaitali

10

To jeden dostaje dokładnie takie samo zachowanie jak iPod.app:

- (void)viewWillAppear:(BOOL)animated 
{ 
[super viewWillAppear:animated]; 

CGFloat searchBarHeight = CGRectGetHeight([[[self searchDisplayController] searchBar] frame]); 
if ([[self tableView] contentOffset].y < searchBarHeight) 
    [[self tableView] setContentOffset:CGPointMake(0, searchBarHeight)]; 
} 
3

Działa to dla mnie.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.tableView.bounces = YES; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    [self.tableView setContentOffset:CGPointMake(0, 44)]; 
} 
-2

I niby jak robi to w ten sposób:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    // Hide the table view header by default. 
    NSIndexPath *index = [NSIndexPath indexPathForRow:0 inSection:0]; 
    [self.tableView scrollToRowAtIndexPath:index atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
} 

ten sposób tak naprawdę nie trzeba się martwić o tym, jak wysoki jest twój nagłówek. Po prostu działa!

+1

Rozwiązanie powoduje awarię aplikacji, jeśli widok tabeli nie załadował wierszy lub ma zero wierszy. – Zorayr

+0

Oh gotcha. Dzięki za komentarz Zorayr – Caborca87

0

musiałem przejść najpierw do góry a następnie setContentOffset do 0, Then wyszukiwania przywraca być widoczne:

self.tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: UITableViewScrollPosition.Top, animated: false) 
self.tableView.setContentOffset(CGPointMake(0, 0), animated: false) 
Powiązane problemy