AutolayoutでiOSのアニメーションを実装する時のメモ

iOSでアニメーションの実装をする時の注意点メモ。

  • AutoLayoutの変更の反映は、UIViewのlayoutIfNeededメソッドを使う。

  • UIViewに対するアニメーションは、

+ (void)animateWithDuration:(NSTimeInterval)duration
                      delay:(NSTimeInterval)delay
                    options:(UIViewAnimationOptions)options
                 animations:(void (^)(void))animations
                 completion:(void (^)(BOOL finished))completion

使用する。例えば、次のようにする。

[UIView animateWithDuration:0.25f  //Animationの時間
                 animations:^{
                      //Autolayoutの変更
                      self.heightConstraint.constant = 100.0f;
                      //Autolayoutの反映
                      [self.view layoutIfNeeded];
               } completion:^(BOOL finished) {
                      //Animation後の処理   
}];
  • UIScrollViewのcontentOffsetはNavigationBarやTabBarのHeight分調整されるNavigationBarやTabBarの位置がどこにあっても、Height分調整される。対処方法は、Heightを0にするか、以下のメソッドを使用する。
//NavigationBarの場合
[self.navigationController setNavigationBarHidden:YES
                                         animated:NO];

//TabBarの場合
self.tabBarController.tabBar.hidden = YES;
  • TabBarとNavigationBarを隠す処理は次のように書く。
    //表示する
    [UIView animateWithDuration:0.25f
                     animations:^{
                         UINavigationBar *navBar = self.navigationController.navigationBar;
                         UITabBar *tabBar = self.tabBarController.tabBar;
                         [self.navigationController setNavigationBarHidden:NO
                                                                  animated:NO];
                         self.tabBarController.tabBar.hidden = NO;
                         
                         
                         navBar.frame = CGRectMake(navBar.frame.origin.x,
                                                   navBar.frame.origin.y,
                                                   navBar.frame.size.width,
                                                   navBar.frame.size.height);
                         
                         tabBar.frame = CGRectMake(tabBar.frame.origin.x,
                                                   tabBar.frame.origin.y-tabBar.frame.size.height,
                                                   tabBar.frame.size.width,
                                                   tabBar.frame.size.height);
                         
                     } completion:^(BOOL finished) {
                         
                     }];
    //隠す
    [UIView animateWithDuration:0.25f
                     animations:^{
                         UINavigationBar *navBar = self.navigationController.navigationBar;
                         UITabBar *tabBar = self.tabBarController.tabBar;
                         
                         navBar.frame = CGRectMake(navBar.frame.origin.x,
                                                   navBar.frame.origin.y-20.0f-navBar.frame.size.height,
                                                   navBar.frame.size.width,
                                                   navBar.frame.size.height);
                         tabBar.frame = CGRectMake(tabBar.frame.origin.x,
                                                   tabBar.frame.origin.y+tabBar.frame.size.height,
                                                   tabBar.frame.size.width,
                                                   tabBar.frame.size.height);
                         
                     } completion:^(BOOL finished) {
                         //hide tabbar and navbar
                         [self.navigationController setNavigationBarHidden:YES
                                                                  animated:NO];
                         self.tabBarController.tabBar.hidden = YES;
                         
                     }];
  • animationsブロックの処理が反映された後、layoutが再計算される。animationsでviewを移動させた後、その場所に留まらせたい場合はcompletionブロックで同じ値を設定する。