iOS18 取消/适配TabbarController缩放动画

升级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
相关推荐
前进的李工1 天前
Agent 学习笔记 05:系统提示词应该怎么写
笔记·学习·prompt·agent·个人开发·few-shot·ai应用开发
正在走向自律1 天前
【3/5】人工智能训练师 三级/高级工 考证学习方向:从“独立执行”到“设计、归因与全链条负责”
人工智能·学习·人工智能训练师·注方案设计·数据质控负责人·模型评测与调优辅助·ai训练项目交付
Fatbobman(东坡肘子)1 天前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift
CCIE-Yasuo1 天前
网络安全-学习数据库-Mysql-2
数据库·学习·mysql
La Pulga1 天前
【FreeRTOS源码学习笔记】任务切换
单片机·mcu·学习·嵌入式·freertos·实时操作系统
li星野1 天前
【学习记录】逻辑分析仪完全入门:从品牌方案到采样率、存储深度的核心概念解析
学习
旖旎夜光1 天前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
WEI_YANG_JU1 天前
初中数学教学中合作学习的研究与实践
学习
码农小韩1 天前
FPGA学习(一)——LED点灯与开发流程
学习·fpga开发·入门·环境配置·仿真·点灯
李长渊哦1 天前
Qoder 自定义子智能体(Subagent)学习笔记
chrome·笔记·学习