升级iOS18后,系统的tabbar会加入缩放动画,下面我们来探讨一下如何去除缩放
1、在选中item的方法中添加去除动画
使用 performWithoutAnimation: 来包裹 self.selectedIndex 的设置可以有效地禁用 tabBar 切换时的动画效果。
[UIView performWithoutAnimation:^{
self.selectedIndex = item.tag - ButtonTag;
}];
2、使用代理方法设置动画时间为0
1.tabBarController:animationControllerForTransitionFromViewController:toViewController:
这个方法是 UITabBarControllerDelegate 协议中的一个可选方法。当 UITabBarController 切换标签视图时,可以使用此方法来提供自定义的动画控制器。它的返回值是一个符合 UIViewControllerAnimatedTransitioning 协议的对象,该对象控制视图转换的动画。
代码中,返回的是 self,意味着该类(即 TabBarController)将自己用作动画控制器。
2. animateTransition:
这个方法是 UIViewControllerAnimatedTransitioning 协议的一部分,用于定义具体的转换动画。当 UITabBarController 切换视图时,会调用这个方法来执行动画。在这里:
UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey];
[transitionContext.containerView addSubview:toView];
[transitionContext completeTransition:YES];
• toView 是目标视图控制器的视图。
• addSubview: 将目标视图添加到 transitionContext.containerView 中。
• [transitionContext completeTransition:YES]; 表示转换已经完成。
因为没有设置任何动画,转换过程是即时的,看起来就像没有动画一样。
3. transitionDuration:
这个方法返回动画的持续时间。在你的代码中返回了 0,这表示转换没有延迟,立即完成。这也是为什么标签切换时没有动画效果的原因。
下面是具体实现方法:
@interface TabBarController () <UIViewControllerAnimatedTransitioning, UITabBarControllerDelegate>
@end
@implementation TabBarController
- (void)viewDidLoad {
[super viewDidLoad];
//设置代理
self.delegate = self;
}
#pragma mark - UITabBarControllerDelegate
- (nullable id <UIViewControllerAnimatedTransitioning>)tabBarController:(UITabBarController *)tabBarController
animationControllerForTransitionFromViewController:(UIViewController *)fromVC
toViewController:(UIViewController *)toVC {
return self;
}
#pragma mark - UIViewControllerAnimatedTransitioning
- (void)animateTransition:(nonnull id<UIViewControllerContextTransitioning>)transitionContext {
UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey];
[transitionContext.containerView addSubview:toView];
[transitionContext completeTransition:YES];
}
//返回0s禁用动画
- (NSTimeInterval)transitionDuration:(nullable id<UIViewControllerContextTransitioning>)transitionContext {
return 0;
}
@end