2013-03-12 18 views
9

ho bisogno di implementare qualcosa di simile:Come rendere barra di navigazione come Instagram

NavBar stay on top, tableView bounces

tableView deve rimbalzare, ma non barra di navigazione.

Ho provato un sacco di varianti diverse. Qualcosa di simile a questo:

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

Ottenere questo:

1 2

non è adatto perché in Instagram dimensioni tableView non cambia (basta guardare gli indicatori di scorrimento, se la dimensione di tableView modificato, hanno anche cambiato)

please look at scroll indicators please look at scroll indicators

Inoltre ho provato ad aggiungere Visualizza come subView in TableView, funziona, ma non esattamente quello che mi serve è. Nella barra di navigazione di Instagram all'esterno di tableView, quindi non è adatto.

Nella barra di ricerca di facebook app si comporta esattamente lo stesso

enter image description here

Qualcuno mi può aiutare?

Grazie!

+0

Non sono sicuro se ho ottenuto questo corretto, stai dicendo che vuoi una vista di intestazione che si sovrappone al tuo contenuto? Forse metti più annotazioni nelle tue immagini perché non vedo barre di navigazione che potrebbero essere ciò che mi confonde. – 7usam

+0

@ 7usam, probabilmente ho torto a dirlo, ho bisogno di ottenere il comportamento della barra di navigazione (o qualsiasi altra vista) è la stessa di Instagram o Facebook. – wiruzx

+0

Stai parlando del "nome tag" su Instagram? – 7usam

risposta

1

Avere lo stesso approccio nel codice di esempio ma piuttosto che aumentare l'altezza della vista della tabella, lo si ha precaricato con l'altezza aggiuntiva (non visibile) e spostarlo verso l'alto diminuendo la y del fotogramma. L'altezza aggiuntiva sarà fuori campo. Se l'altezza del contenuto non è sufficiente per andare fuori schermo, non è necessario avere l'altezza fuori schermo.

Aggiungi un'intestazione con altezza = 0 all'inizio e mentre scorri verso il basso aumenta le dimensioni, fino a 100 (l'intestazione vuota sarà fuori dallo schermo ora). In questo modo il contenuto non verrà troncato mentre scorri.

+0

@wiruzx puoi spiegare come questo non funziona correttamente? – 7usam

+0

se guardi gli screenshot 2 e 3, devi notare che le celle di visualizzazione tabella si nascondono su uppe r vista La velocità di spostamento della vista superiore e delle celle è defferente in quanto ho modificato y-ordinata di tableview – wiruzx

+0

@wiruzx.Vedo, il problema è che scrolla la vista della tabella. Cosa ne pensi di aggiungere un'intestazione, vedere la risposta modificata. – 7usam

1

L'instagram "barra di navigazione" non è una barra di navigazione. È un'intestazione di sezione di tabella. Noterai che quando tocchi una foto, l'intera barra di navigazione scivola via. Questo perché fa parte del controller di visualizzazione tabella e non è una barra di navigazione "reale".

È possibile ottenere ciò utilizzando un UINavigationController ma nascondendo la barra di navigazione (setNavigationBarHidden: YES). Basta chiamare pushViewController: animato: manualmente quando si desidera eseguire il push.

È interessante notare che le altre schede di Instagram utilizzano solo una normale barra di navigazione e non fanno niente di particolare. Immagino che volessero davvero quei 44 punti nella schermata principale del feed.

+0

ma se questa intestazione di sezione, quindi perché non rimbalza con il resto della tabella? e perché la pergamena l'indicatore si ferma proprio di fronte a lui? (schermata 5) – wiruzx

+1

Non sarebbe un'intestazione di tabella piuttosto che un'intestazione di sezione di tabella? – 7usam

+1

@ 7usam comunque nella barra di navigazione di Instagram all'esterno del tavoloView – wiruzx

1

Se si prendono di mira iOS 5+ che si può facilmente personalizzare la barra di navigazione come questa:

1- Aggiungi il TableViewController all'interno di un UINavigationController

2- Personalizzare la barra di navigazione:

Imposta immagine di sfondo per la navigazione barra

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

Aggiungi pulsante di aggiornamento sul lato destro

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]; 

Speranza che aiuta!

1

È possibile utilizzare il metodo riportato di seguito nella classe in cui si desidera aggiungere effetti sulla barra di navigazione come 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; 

} 
Problemi correlati