2013-10-14 5 views
12

Lorsque vous faites défiler du contenu dans Safari, la barre de titre s'anime à une version plus petite de son auto. Quelle est la meilleure façon de mettre en œuvre cela?Animation de UINavigationBar dans iOS 7 (comme Safari)

Actuellement, je suis en train de changer la taille du cadre comme ceci:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    // 
    // Table view 
    // 
    CGFloat currentPosition = scrollView.contentOffset.y - CGRectGetHeight(self.tableView.tableHeaderView.frame) + CGRectGetHeight(self.navigationController.navigationBar.frame) + CGRectGetHeight([[UIApplication sharedApplication] statusBarFrame]); 

    if ([scrollView isKindOfClass:[HeadlinesHeadlinesTableView class]]) { 
     ScrollDirection scrollDirection; 

     if (self.lastContentOffset > scrollView.contentOffset.y) { 
      scrollDirection = ScrollDirectionDown; 
     } else if (self.lastContentOffset < scrollView.contentOffset.y) { 
      scrollDirection = ScrollDirectionUp; 
     } 

     self.lastContentOffset = scrollView.contentOffset.y; 

     CGRect frame = self.navigationController.navigationBar.frame; 
     CGFloat minimumFrameHeight = 30.0f; 
     CGFloat maximumFrameHeight = 44.0f; 

     CGFloat titleSize = [[self.navigationController.navigationBar.titleTextAttributes objectForKey:NSFontAttributeName] pointSize]; 
     CGFloat minimumTitleHeight = 22.0f; 
     CGFloat maximumTitleHeight = 30.0f; 

     if (currentPosition > 0 && CGRectGetHeight(frame) >= minimumFrameHeight && CGRectGetHeight(frame) <= maximumFrameHeight) { 
      switch (scrollDirection) { 
       case ScrollDirectionUp: 
        frame.size.height--; 
        titleSize--; 
        break; 

       case ScrollDirectionDown: 
        frame.size.height++; 
        titleSize++; 
        break; 

       default: 
        break; 
      } 

      if (CGRectGetHeight(frame) <= minimumFrameHeight) { 
       frame.size.height = minimumFrameHeight; 
      } 

      if (CGRectGetHeight(frame) >= maximumFrameHeight) { 
       frame.size.height = maximumFrameHeight; 
      } 

      if (titleSize <= minimumTitleHeight) { 
       titleSize = minimumTitleHeight; 
      } 

      if (titleSize >= maximumTitleHeight) { 
       titleSize = maximumTitleHeight; 
      } 
     } 

     [self.navigationController.navigationBar setFrame:frame]; 
     [self.navigationController.navigationBar setTitleTextAttributes: @{ NSFontAttributeName : [UIFont fontWithName:@"Canterbury-Regular" size:titleSize] }]; 
    } 
} 

Naturellement, cette façon est pas lisse et beaucoup de code, sans parler du fait que je dois disparaître bouton de la barre articles aussi bien.

Merci d'avance!

+0

Une approche différente pourrait être à la place de uibuttons d'uibarbuttonitem d'utilisation ajouté à la barre de navigation, puis juste mess avec l'alpha, par exemple. button.alpha = 0.0f; quelque chose comme ça .. espérons que vous guide dans la bonne direction :) –

+0

Voir aussi: http://stackoverflow.com/questions/19819165/imitate-ios-7-facebook-hide-show-expanding-contracting-navigation-bar/ –

Répondre

5

Jetez un oeil à AMScrollingNavbar, il a déjà un support de fondu. Vous pouvez essayer de changer la taille de la barre de navigation pour réduire le titre.

+1

Merci, cela fonctionne! – tuttu47

Questions connexes