2015-05-05 27 views
5

Sono davvero bloccato qui. Vorrei ridurre la barra di navigazione quando scorro verso il basso un UITableView e lo ingrandisco di nuovo quando lo si scorre. Sono riuscito a modificare la dimensione della barra di navigazione, ma l'immagine del titolo non si sta riducendo con la barra di navigazione.Swift - Riduci barra di spostamento a scorrimento

Voglio fare esattamente come Safari, e il problema è che l'altezza del mio TitleView si sta restringendo, ma la larghezza non cambia mai.

Ecco il codice che ho utilizzato per modificare l'altezza della barra di scorrimento.

func scrollViewDidScroll(scrollView: UIScrollView) { 
     var navbar = navigationController?.navigationBar 
     var dir:CGPoint = tableview.panGestureRecognizer.translationInView(self.tableview) 
     var scrollViewHeight = tableview.frame.size.height 
     var scrollContentSizeHeight = tableview.contentSize.height 
     var scrollOffset = tableview.contentOffset.y 

     if (dir.y > 0 && self.formernavstate == "small") { 
      self.formernavstate = "big" 

      UIView.animateWithDuration(0.5, delay:0.0, options: UIViewAnimationOptions.AllowAnimatedContent, animations: {() -> Void in 

      println("") 
      navbar?.frame.origin.y = 20 
      self.navigationItem.titleView?.transform = CGAffineTransformMakeScale(0.52, 0.6) 
      }, completion: nil) 
     } 

     if (dir.y < 0 && self.formernavstate == "big") { 
      self.formernavstate = "small" 
      navbar?.frame.origin.y = 0 
      navigationItem.titleView?.transform = CGAffineTransformMakeScale(0.0001, 0.2) 
     } 
    } 

risposta

1

// Basta Copiate e incollate questo codice

var lastContentOffsetAtY : CGFloat = 0.0 

func scrollViewWillBeginDragging(scrollView: UIScrollView) { 
    self.lastContentOffsetAtY = scrollView.contentOffset.y 
} 

func scrollViewDidScroll(scrollView: UIScrollView) { 
    if lastContentOffsetAtY < scrollView.contentOffset.y { 
     print("Bottom") 
     //self.navigationController?.setNavigationBarHidden(true, animated: true) 
     shrinkTheCustomNavigationBar(isShrink: true) 
    } else if lastContentOffsetAtY > scrollView.contentOffset.y { 
     print("Top") 
     //self.navigationController?.setNavigationBarHidden(false, animated: true) 
     shrinkTheCustomNavigationBar(isShrink: false) 
    } 
} 

func shrinkTheCustomNavigationBar(isShrink isShrink:Bool) { 
    if isShrink == true{ 
     if self.navigationController?.navigationBar.frame.size.height > 22.0{ 
      UIView.animateWithDuration(0.1, animations: { 
       self.navigationController?.navigationBar.frame = CGRectMake((self.navigationController?.navigationBar.frame.origin.x)!, (self.navigationController?.navigationBar.frame.origin.y)!, (self.navigationController?.navigationBar.frame.size.width)!, (self.navigationController?.navigationBar.frame.size.height)! - 3) 
       self.view.layoutIfNeeded() 
       self.navigationController?.navigationItem.titleView?.frame = CGRectMake(0, 0, 320, (self.navigationController?.navigationBar.frame.size.height)!) 
       self.navigationController?.navigationItem.titleView = self.titleLable 
       }, completion: { (success) in 
      }) 
     } 
    } else { 
     if self.navigationController?.navigationBar.frame.size.height < 44.0{ 
      UIView.animateWithDuration(0.1, animations: { 
       self.navigationController?.navigationBar.frame = CGRectMake((self.navigationController?.navigationBar.frame.origin.x)!, (self.navigationController?.navigationBar.frame.origin.y)!, (self.navigationController?.navigationBar.frame.size.width)!, (self.navigationController?.navigationBar.frame.size.height)! + 3) 
       self.view.layoutIfNeeded() 
       self.navigationController?.navigationItem.titleView?.frame = CGRectMake(0, 0, 320, (self.navigationController?.navigationBar.frame.size.height)!) 
       self.navigationController?.navigationItem.titleView = self.searchBarField 
       }, completion: { (success) in 
      }) 
     } 
    } 
} 
+0

Potresti aggiornare questo codice. Non sono abbastanza sicuro che stai confrontando il cgRect con l'operando, grazie. –

1

ho implementato un 3 versione Swift con un "colpo di testa" e il ridimensionamento personalizzato è vincolo di altezza in base alla risposta di @ Chauhan:

extension ViewController: UIScrollViewDelegate { 

    func scrollViewDidScroll(_ scrollView: UIScrollView) { 
     if scrollViewOffset < scrollView.contentOffset.y { 
      shrinkHeader(shrink: true) 
     } else if scrollViewOffset > scrollView.contentOffset.y { 
      shrinkHeader(shrink: false) 
     } 
    } 

    func shrinkHeader(shrink: Bool) { 
     if shrink { 
      if self.headerContainerHeightConstraint.constant > CGFloat(minHeaderHeight) { 
       UIView.animate(withDuration: 0.1, animations: { 
        self.headerContainerHeightConstraint.constant = self.headerContainerHeightConstraint.constant - 2 
        self.view.layoutIfNeeded() 
       }) 
      } 
     } else { 
      if self.headerContainerHeightConstraint.constant < CGFloat(maxHeaderHeight) { 
       UIView.animate(withDuration: 0.1, animations: { 
        self.headerContainerHeightConstraint.constant = self.headerContainerHeightConstraint.constant + 6 
        self.view.layoutIfNeeded() 
       }) 
      } 
     } 
    } 
} 
Problemi correlati