2014-12-22 26 views
14

Sto tentando di implementare UINavigationBar che cambia la sua trasparenza quando si scorre UITableView. All'inizio, la barra di navigazione dovrebbe avere sfondo trasparente, in modo che il contenuto di sotto di esso dovrebbe essere visibile (ci sarà un'immagine visualizzata, per l'esempio che sto usando colore solido):UINavigationBar che cambia trasparenza durante lo scorrimento

Example 1

When utente scorre vista tabella, la trasparenza dovrebbe essere sostituito con il colore solido:

Example 2

vista tabella contiene intestazioni di sezione, che dovrebbe agire come quando si utilizza barra di navigazione non traslucido. I punti di vista di intestazione devono "attaccare" alla barra di navigazione, una volta che "toccano" dal basso:

Example 3

non ho fortuna con il tentativo di implementare questo flusso in iOS.

per lo stato iniziale, io pongo UINavigationBartranslucent proprietà YES, ed entrambi backgroundColor e barTintColor per cancellare il colore, che mi dà quello che voglio.

Quindi, quando l'utente scorre la vista tabella, sto aggiornando backgroundColor e barTintColor in un colore con un determinato componente alfa, calcolato basandosi sull'offset di scorrimento corrente. Sto usando scrollViewDidScroll: dal protocollo UIScrollViewDelegate per farlo. Tuttavia, cambia solo lo sfondo della barra di navigazione, lasciando lo sfondo della barra di stato trasparente, che non è quello che voglio.

Non riesco a trovare un altro modo di rendere UINavigationBar trasparente senza impostare la proprietà translucent su YES. Sfortunatamente, questo cambia il modo in cui le intestazioni di sezione agiscono durante lo scorrimento. Poiché la barra di navigazione è traslucida, le viste delle intestazioni di sezione si nascondono al di sotto di esso quando devono "attaccarsi" alla barra come nella terza schermata sopra.

Apprezzerei qualsiasi aiuto e suggerimenti su come ottenere una barra di navigazione che funzioni come descritto o simile in Objective-C o Swift.

+9

Hey controllare [LTNavigationbar] (https://github.com/ltebean/LTNavigationbar) che potrebbe essere utile. –

+0

Grazie a @Prince !! Incredibile trovare !! – SleepsOnNewspapers

+0

State cercando quella scoperta @PareshNavadiya Grazie mille. – Gugulethu

risposta

2

Supponendo di avere un riferimento alla vista sopra la tableView e che non si desidera interagire nulla in esso:

var overlayView:UIView! 
var offsetDenominator:CGFloat! 
let TARGER_COLOR = UIColor.blackColor() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    if let navCtrl = self.navigationController { 
     self.offsetDenominator = headerView.frame.size.height - navCtrl.navigationBar.frame.height 

     let targetCIColor = CIColor(CGColor: self.TARGER_COLOR.CGColor) 
     let overlayColor = UIColor(red: targetCIColor.red, green: targetCIColor.green, blue: targetCIColor.blue, alpha: 0.0) 

     self.overlayView = UIView(frame: self.headerView.frame) 
     self.overlayView.backgroundColor = overlayColor 

     self.view.addSubview(self.overlayView) 
    } 

... 

override func scrollViewDidScroll(scrollView: UIScrollView) { 
    if let navCtrl = self.navigationController, let breakpoint = offsetDenominator { 
     let alpha = scrollView.contentOffset.y/breakpoint 

     if alpha >= 1.0 { 
      navCtrl.navigationBar.backgroundColor = self.TARGER_COLOR 
     } else { 
      let targetCIColor = CIColor(CGColor: self.TARGER_COLOR.CGColor) 
      let overlayColor = UIColor(red: targetCIColor.red, green: targetCIColor.green, blue: targetCIColor.blue, alpha: alpha) 

      self.overlayView.backgroundColor = overlayColor 
      navCtrl.navigationBar.backgroundColor = UIColor.clearColor() 
     } 
    } 
} 
0

Swift3

var navAlpha = // Your appropriate calculation 
self.navigationController!.navigationBar.backgroundColor = UIColor.red.withAlphaComponent(navAlpha) 
Problemi correlati