網(wǎng)上的一些定義 tabBar 點(diǎn)擊動(dòng)畫(huà)的做法一般是自定義一個(gè) tabBar 把這個(gè) tabBar 通過(guò) KVC 設(shè)置給 tabBarController 然后在這個(gè) tabBar 里做一些自定義必怜。但是tabBar 的實(shí)現(xiàn)對(duì)我們是未知的,很難保證這種替換方式會(huì)不會(huì)造成其他的副作用生真,所以最好的方法就是不去動(dòng) tabBar 而是想辦法拿到想要進(jìn)行動(dòng)畫(huà)的 view袜蚕。
先通過(guò) Reveal 分析一下 UITabBarController 的 結(jié)構(gòu):
1.先建一個(gè) Demo 過(guò)程回挽,tabBarController 有2個(gè) childViewcontroller驼鞭,一個(gè)有title一個(gè)沒(méi)有title骂删。
2.通過(guò) Reveal 分析 tabBar 的子控件會(huì)發(fā)現(xiàn)每個(gè)可以點(diǎn)擊的 item 是一個(gè)叫“UITabBarButton”的控件儒老,這個(gè)控件負(fù)責(zé)承載圖片和標(biāo)題文字(如果存在)蝴乔。
3.3.知道了控件的名字我們就可以在 UITabBarController 的 delegate 方法 - (void)tabBarController:(UITabBarController)tabBarController didSelectViewController:(UIViewController)viewController; 中定位當(dāng)前點(diǎn)擊的按鈕然后找到對(duì)應(yīng)的圖片了。
- (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];//找到當(dāng)前被選擇的 button
__block UIImageView *imageView = nil;//找到 button 上的圖片驮樊,然后就可以添加動(dòng)畫(huà)了
[tabBarButton.subviews enumerateObjectsUsingBlock:^(__kindof UIView *_Nonnull obj,NSUInteger idx,BOOL *_Nonnull stop) {
if([obj isKindOfClass:[UIImageViewclass]]) {
imageView = obj;
*stop =YES;
}
}];
}