2015-06-06 1 views
1

Я пытаюсь добиться эффекта «показать/скрыть вкладку», и содержимое будет расширено, чтобы заполнить пространство, в котором была панель вкладок.Autolayout with hide/show tab bar animation в iOS7

Я нашел код для отображения/скрытия панели вкладок и я доволен (источник: http://www.developers-life.com/hide-uitabbarcontrolleruitabbar-with-animation.html)

я добавил следующий код для размещения моя кнопка соответственно:

if (hiddenTabBar) { 

    self.constraintToBottom.constant=0; 
    [self.TestButton setNeedsUpdateConstraints]; 
} else { 
    self.constraintToBottom.constant=-49; 
    [self.TestButton setNeedsUpdateConstraints]; 

} 
[self.TestButton layoutIfNeeded]; 

и это работает как и ожидалось. Кроме анимации кнопки. Это начальный экран приложения перед тем анимации:

Before animation

и это после того, как анимация

After animation

я могу успешно скрыть панель вкладок и положение кнопки с правильной анимацией. Однако, когда я хочу снова отобразить панель вкладок, кнопка, похоже, начинает снизу (снаружи) экрана вместо положения, как показано на второй диаграмме. Я настроить время анимации, так что я могу захватить экран во время анимации:

Weird thing happen when i show it again

следующий мой полный код для скрытия/показа действия панели вкладок

- (IBAction)TestTapped:(id)sender { 
[UIView beginAnimations:nil context:NULL]; 
if(hiddenTabBar) 
    [UIView setAnimationDuration:60]; 
else 
    [UIView setAnimationDuration:0.5]; 
for(UIView *view in self.tabBarController.view.subviews) 
{ 
    CGRect _rect = view.frame; 
    if([view isKindOfClass:[UITabBar class]]) 
    { 
     if (hiddenTabBar) { 

      _rect.origin.y = 431; 
      [view setFrame:_rect]; 


     } else { 
      _rect.origin.y = 480; 
      [view setFrame:_rect]; 

     } 
    } else if(view==self.TestButton) 
    { 
     NSLog(@"ZZ"); 
    } 
    else{ 
     if (hiddenTabBar) { 

      _rect.size.height = 431; 
      [view setFrame:_rect]; 
     } else { 
      _rect.size.height = 480; 
      [view setFrame:_rect]; 

     } 
    } 

} 
if (hiddenTabBar) { 

    self.constraintToBottom.constant=0; 
    [self.TestButton setNeedsUpdateConstraints]; 
} else { 
    self.constraintToBottom.constant=-49; 
    [self.TestButton setNeedsUpdateConstraints]; 

} 
[self.TestButton layoutIfNeeded]; 
[UIView commitAnimations]; 
hiddenTabBar =!hiddenTabBar; 

}

Я ожидал бы, что анимация кнопки начнется с точного положения моей второй диаграммы.

ответ

1

Вы можете использовать эту категорию, чтобы скрыть/показать панель вкладок с анимацией.

----------------------. H файл ---------------------

#define screenSize ([[UIScreen mainScreen ] bounds]) 
@interface UITabBarController (HideTabBar) 
- (void)hideTabBarAnimated:(BOOL)animated; 
- (void)showTabBarAnimated:(BOOL)animated; 
- (void)hideTabBarAnimated:(BOOL)animated complition:(void(^)())complition; 

@end 

----------------------. M file ------------------ ---

#define kAnimationDuration .2 
@implementation UITabBarController (HideTabBar) 

- (void)hideTabBarAnimated:(BOOL)animated complition:(void(^)())complition 
{ 
    CGRect statusbarFrame = [UIApplication sharedApplication].statusBarFrame; 
    CGRect tabBarControllerFrame = self.view.frame; 
    if (statusbarFrame.size.height>20) 
    { 
     tabBarControllerFrame.size.height = screenSize.size.height + self.tabBar.frame.size.height - 20.0; 
    } 
    else 
    { 
     tabBarControllerFrame.size.height = screenSize.size.height + self.tabBar.frame.size.height ; 
    } 

    if (animated) { 
     [UIView animateWithDuration:0.2 animations:^{ 
      [self.view setFrame:tabBarControllerFrame]; 
     } completion:^(BOOL finished) { 
      if (complition) { 
       complition(); 
      } 
     }]; 
    } 
    else 
    { 
     [self.view setFrame:tabBarControllerFrame]; 
     if (complition) { 
      complition(); 
     } 
    } 
} 
- (void)hideTabBarAnimated:(BOOL)animated 
{ 
    [self hideTabBarAnimated:animated complition:nil]; 
} 

- (void)showTabBarAnimated:(BOOL)animated { 
    CGRect statusbarFrame = [UIApplication sharedApplication].statusBarFrame; 
    CGRect tabBarControllerFrame = self.view.frame; 
    if (statusbarFrame.size.height>20) 
    { 
     tabBarControllerFrame.size.height = screenSize.size.height - 20.0; 
    } 
    else 
    { 
     tabBarControllerFrame.size.height = screenSize.size.height ; 
    } 

    if (animated) { 
     [UIView animateWithDuration:0.2 animations:^{ 
      [self.view setFrame:tabBarControllerFrame]; 
     } completion:^(BOOL finished) { 

     }]; 
    } 
    else 
     [self.view setFrame:tabBarControllerFrame]; 
} 
@end 

Используется как с ViewController как.

[self.tabBarController hideTabBarAnimated:YES];//You can use completion handler if you want. 

Возможно, это решит вашу проблему.