2013-03-12 7 views
9

zu machen brauche ich so etwas wie dies umzusetzen:Wie Navigationsleiste wie Instagram

NavBar stay on top, tableView bounces

Tableview muss abprallen, aber nicht Navigationsleiste.

Ich versuchte eine Reihe von verschiedenen Varianten. Etwas wie folgt aus:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    CGRect imageViewFrame = self.imageView.frame; 
    CGRect tableViewFrame = self.tableView.frame; 
    //ImageView - is top view(instead of NavBar) 
    //defaultHeight - is default height of tableView 
    imageViewFrame.origin.y = MIN(0, MAX(-scrollView.contentOffset.y, -100)); 
    tableViewFrame.origin.y = imageViewFrame.origin.y + 100; 
    tableViewFrame.size.height = defaultHeight - imageViewFrame.origin.y; 

    self.imageView.frame = imageViewFrame; 
    self.tableView.frame = tableViewFrame; 
} 

diese:

1 2

es nicht geeignet ist, weil in Instagram Größe von Tableview nicht ändert (nur Blick auf Scroll-Indikatoren, wenn Größe Tableview geändert, sie verändert auch)

please look at scroll indicators please look at scroll indicators

Auch ich habe versucht, als Unteransicht in TableView hinzufügen, es funktioniert, aber nicht genau das, was ich brauche. In Instagram Navigationsleiste außerhalb des TableView, so ist es auch nicht geeignet.

In der Facebook-App-Suchleiste verhält sich genau das gleiche

enter image description here

mir jemand helfen?

Danke!

+0

Ich bin wirklich nicht sicher, ob ich das richtig verstanden habe, sagst du, dass du eine Header-Ansicht haben möchtest, die deinen Inhalt überlagert? Fügen Sie vielleicht mehr Anmerkungen in Ihre Bilder ein, weil ich keine Navigationsleisten sehe, die mich verwirren könnten. – 7usam

+0

@ 7usam, ich bin wahrscheinlich falsch zu sagen, ich muss das Verhalten der Navigationsleiste (oder einer anderen Ansicht) ist das gleiche wie in Instagram oder Facebook. – wiruzx

+0

Sprechen Sie über das "Namensschild" in Instagram? – 7usam

Antwort

1

Verwenden Sie den gleichen Ansatz im Beispielcode, aber anstatt die Höhe der Tabellenansicht zu vergrößern, haben Sie sie mit der zusätzlichen (nicht sichtbaren Höhe) vorgeladen und verschieben sie einfach nach oben, indem Sie das y des Rahmens verringern. Die zusätzliche Höhe wird außerhalb des Bildschirms angezeigt. Wenn die Höhe des Inhalts nicht groß genug ist, um außerhalb des Bildschirms angezeigt zu werden, ist die Höhe des Bildschirms nicht erforderlich.

Fügen Sie beim Start eine Kopfzeile mit height = 0 hinzu, und wenn Sie nach unten scrollen, erhöht sich die Größe auf bis zu 100 (die leere Kopfzeile wird jetzt ausgeblendet). Auf diese Weise wird der Inhalt beim Scrollen nicht abgeschnitten.

+0

@wiruzx können Sie erklären, wie dies nicht richtig funktioniert – 7usam

+0

Wenn Sie sich 2 und 3 Screenshot ansehen, müssen Sie feststellen, dass Tabellenansicht Zellen auf uppe verbirgt r Ansicht. Geschwindigkeit der Verschiebung der Draufsicht und Zellen ist defferent, weil ich y-Cordinate von tableview geändert – wiruzx

+0

@wiruzx Ich sehe, das Problem ist, dass Tableview scrollt. Was denkst du über das Hinzufügen einer Kopfzeile, siehe bearbeitete Antwort. – 7usam

1

Die Instagram "Navigationsleiste" ist keine Navigationsleiste. Es ist ein Tabellenabschnitt Header. Sie werden feststellen, dass beim Tippen auf ein Foto die gesamte Navigationsleiste wegrutscht. Das liegt daran, dass es Teil des Tabellenansicht-Controllers ist und keine "echte" Navigationsleiste.

Sie können dies erreichen, indem Sie einen UINavigationController verwenden, aber die Navigationsleiste ausblenden (setNavigationBarHidden: YES). Sie rufen einfach pushViewController: animiert: manuell, wenn Sie drücken möchten.

Interessanterweise sieht es so aus, als ob die anderen Registerkarten von Instagram nur eine normale Navigationsleiste verwenden und nichts Besonderes machen. Ich vermute, dass sie diese 44 Punkte wirklich auf dem Hauptbildschirm haben wollten.

+0

aber wenn dieser Abschnitt Header, warum es nicht mit dem Rest der Tabelle springt und warum die Rolle (screenshot # 5) – wiruzx

+1

Wäre nicht ein Tabellenheader eher als ein Tabellenbereich header? – 7usam

+1

@ 7usem sowieso in Instagram navbar außerhalb der Tabelle View – wiruzx

1

Wenn Sie iOS zielen 5+ als Sie bequem die Navigationsleiste wie folgt anpassen:

1- Fügen Sie Ihre Tableviewcontroller innerhalb eines UINavigationController

2- Anpassen der Navigationsleiste:

Stellen Sie Hintergrundbild für die Navigation Bar

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"bar_background"] 
            forBarMetrics:UIBarMetricsDefault]; 

hinzufügen Refresh-Button auf der rechten Seite

UIImage *img = [UIImage imageNamed:@"refresh.png"]; 
UIButton *rButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
[rButton setImage:img forState:UIControlStateNormal]; 
[rButton addTarget:vc action:@selector(didTapRefreshButton:) forControlEvents:UIControlEventTouchUpInside]; 
rButton.frame = CGRectMake(0.0f, 0.0f, img.size.width, img.size.height); 
UIBarButtonItem *rButtonItem = [[UIBarButtonItem alloc] initWithCustomView:rButton]; 

self.navigationItem.rightBarButtonItem = rButtonItem; 
[rButtonItem release]; 

Hoffe, das hilft!

1

Sie können die unten genannte Methode in Ihrer Klasse verwenden, in der Sie einen Effekt auf die Navigationsleiste hinzufügen möchten, wie in Instagram.

 - (void)scrollViewDidScroll:(UIScrollView *)sender { 
//Initializing the views and the new frame sizes. 
UINavigationBar *navbar =self.navigationController.navigationBar; 
UIView *tableView = self.view; 
CGRect navBarFrame = self.navigationController.navigationBar.frame; 

CGRect tableFrame = self.view.frame; 

//changing the origin.y based on the current scroll view. 
//Adding +20 for the Status Bar since the offset is tied into that. 

if (isiOS7) { 
    navBarFrame.origin.y = MIN(0, MAX(-44, (sender.contentOffset.y * -1))) +20 ; 
    tableFrame.origin.y = navBarFrame.origin.y + navBarFrame.size.height; 
}else{ 
    navBarFrame.origin.y = MIN(0, (sender.contentOffset.y * -1)) +20; 
    tableFrame.origin.y = MIN(0,MAX(-44,(sender.contentOffset.y * -1))) ; 
} 

navbar.frame = navBarFrame; 
tableView.frame = tableFrame; 

}