2013-05-16 7 views
14

Ich habe eine UITableView, die ich in der Lage, eine Header-Ansicht ziemlich einfach hinzufügen. Viele Apps (wie Facebook, um Ereignisse zu sehen) haben eine Kopfzeile, die anzeigt, dass die Kopfzeile zwar angezeigt wird, aber der Rest der Tabelle (die UITableViewCell) springt. Beim Hochscrollen verschwindet die Kopfzeile. Wie kann ich diese Funktionalität erreichen?UITableVIEW Header ohne Prellen, wenn Pull-Down

jetzt Recht, wenn ich die UITableView nach unten ziehen, auch die headerView auch springt

+0

Wenn Sie "Bounce" sagen, meinen Sie, scrollen Sie nach oben/unten an den Headern vorbei? – Aaron

+0

Grundsätzlich, wenn ich nach unten scrolle, Header bleibt gesetzt. Wenn ich nach oben scrolle, verschwindet der Header. Das ist der TableHeaderView – KVISH

+0

OK - Ich habe die Event-Tabellenansicht der Facebook-App ausgecheckt. Es sieht so aus, als hätte es das Standardverhalten. Wie viele Abschnitte und Zeilen in diesen Abschnitten haben Sie in Ihrer Tabellenansicht? Vielleicht haben Sie nicht genug, um den gewünschten Effekt zu erzielen? – Aaron

Antwort

32

Sie diesen Effekt erreichen kann ganz einfach durch eine Subview der Kopfsicht Hinzufügen und Einstellen seiner frame oder transform, wenn der Tabellenansicht über die obere gescrollt wird, das heißt die y Komponente seiner contentOffset negativ wird.

Beispiel (in einer UITableViewController Unterklasse):

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    CGFloat headerHeight = 64.0f; 
    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, headerHeight)]; 
    UIView *headerContentView = [[UIView alloc] initWithFrame:headerView.bounds]; 
    headerContentView.backgroundColor = [UIColor greenColor]; 
    headerContentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
    [headerView addSubview:headerContentView]; 
    self.tableView.tableHeaderView = headerView; 
} 

//Note: UITableView is a subclass of UIScrollView, so we 
//  can use UIScrollViewDelegate methods. 
- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    CGFloat offsetY = scrollView.contentOffset.y; 
    UIView *headerContentView = self.tableView.tableHeaderView.subviews[0]; 
    headerContentView.transform = CGAffineTransformMakeTranslation(0, MIN(offsetY, 0)); 
} 

(es einfach zu halten, ich habe gerade in scrollViewDidScroll: die erste subview der tatsächlichen Kopfansicht verwendet, mögen Sie vielleicht für die eine Eigenschaft verwenden, stattdessen.)

+1

Das wahre Juwel dieser Lösung ist die Verwendung einer Unteransicht in der Tabelle "HeaderView". Ich habe versucht, dies ohne eine Unteransicht zu tun und bekam sehr seltsame Ergebnisse, daher ist die Unteransicht der Schlüssel. – levigroker

+1

Ihre Lösung ist die beste: D –

+0

, wenn Sie den Tableview-Header auf der Oberseite dann diese Fügte Code angewendet stecken wollen .. - (void) scrollViewDidScroll: (UIScrollView *) scroll { CGFloat offsetY = scrollView.contentOffset.y ; UIView * headerContentView = self.tableView.tableHeaderViewviews [0]; if (offsetY> 0) { headerContentView.transformation = CGAffineTransformMakeTranslation (0, offsetY); } else { headerContentView.transformation = CGAffineTransformMakeTranslation (0, MIN (offsetY, 0)); } } – g212gs

-1

Es gibt zwei Möglichkeiten, wie Sie den Tabellenkopf einstellen:

  • direkt die .tableHeaderView Eigenschaft verwenden (dies Kopfrollen mit der Tabelle)

  • Aufschalten der - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section Funktion (dieser Header bleibt statisch mit dem Abschnitt)

von den Klängen der es sollten Sie die zweite Methode verwenden, anstatt die .tableHeaderView Eigenschaft mit

+0

Ich glaube nicht, dass das richtig ist. Meine Abschnittsüberschriften scrollen nach oben und unten und bleiben beim Scrollen bis zum oberen Rand der Tabellenansichten, bis ein anderer Abschnittskopf sie aus dem Weg schiebt. – Aaron

+0

'tableHeaderView' ist eine Kopfzeile für die gesamte Tabelle, wobei' viewForHeaderInSection' eine Kopfzeile für jeden Abschnitt einfügt. – Aaron

0

Ihre UITableView höchstwahrscheinlich richtig funktioniert. Abschnittsüberschriften sind standardmäßig in Plain-Style-Tabellen fixiert. Das bedeutet, dass Sie beim Scrollen in der Kopfzeile oben im Rahmen des UITableView bleiben, bis der nächste Abschnittskopf sie aus dem Weg räumt. Das Gegenteil tritt auf, wenn Sie nach oben scrollen. Umgekehrt erhalten Sie das klebrige Verhalten auf Abschnitt Fußzeilen am unteren Rand des UITableView Frame.

EDIT Misunderstood die ursprüngliche Frage:

Ich würde vorschlagen, einen Abschnitt Header anstatt der Tabellen-Ansicht Header mit dem klebrigen Verhalten Sie suchen zu erhalten.

Fügen Sie einen Abschnitt in Ihre Daten ohne Zeilen ein und fügen Sie die Ansicht Ihrer Tabellenkopfzeile in die Kopfzeile dieses Abschnitts ein.

+0

Dies ist kein Abschnitt Header, dies ein TableHeaderView – KVISH

+0

Got it. Missverstanden die Frage. – Aaron

+0

änderte meine Antwort. – Aaron

Verwandte Themen