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ブロックで同じ値を設定する。