网上的一些定义 tabBar 点击动画的做法一般是自定义一个 tabBar 把这个 tabBar 通过 KVC 设置给 tabBarController 然后在这个 tabBar 里做一些自定义。但是tabBar 的实现对我们是未知的,很难保证这种替换方式会不会造成其他的副作用,所以最好的方法就是不去动 tabBar 而是想办法拿到想要进行动画的 view。
先通过 Reveal 分析一下 UITabBarController 的 结构:
1.先建一个 Demo 过程,tabBarController 有2个 childViewcontroller,一个有title一个没有title。
2.通过 Reveal 分析 tabBar 的子控件会发现每个可以点击的 item 是一个叫“UITabBarButton”的控件,这个控件负责承载图片和标题文字(如果存在)。
3.3.知道了控件的名字我们就可以在 UITabBarController 的 delegate 方法 - (void)tabBarController:(UITabBarController)tabBarController didSelectViewController:(UIViewController)viewController; 中定位当前点击的按钮然后找到对应的图片了。
- (void)tabBarController:(UITabBarController*)tabBarController didSelectViewController:(UIViewController*)viewController
{
NSMutableArray *tabBarButtonArray = [NSMutableArray array];
[tabBarController.tabBar.subviews enumerateObjectsUsingBlock:^(__kindof UIView*_Nonnull obj,NSUInteger idx,BOOL *_Nonnull stop) {
if([obj isKindOfClass:NSClassFromString(@"UITabBarButton")]) {//先找到所有 UITabBarButton 类型的子控件
[tabBarButtonArray addObject:obj];
}
}];
UIView *tabBarButton = [tabBarButtonArray objectInIndex:tabBarController.selectedIndex];//找到当前被选择的 button
__block UIImageView *imageView = nil;//找到 button 上的图片,然后就可以添加动画了
[tabBarButton.subviews enumerateObjectsUsingBlock:^(__kindof UIView *_Nonnull obj,NSUInteger idx,BOOL *_Nonnull stop) {
if([obj isKindOfClass:[UIImageViewclass]]) {
imageView = obj;
*stop =YES;
}
}];
}