源码说明
RDVTabBarController 是一个定制化的TabBarController库,可动画显示隐藏tabbar栏,可定制tabbar栏
tarbar加载
- 在didFinishLaunchingWithOptions中实现
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; //new UIWindow
[self setupViewControllers]; //新增RDVTabBarController,调用setViewControllers为其添加多个UITableViewController,并为其设置RDVTabBarItem
[self.window setRootViewController:self.viewController];
[self.window makeKeyAndVisible]; //使RDVTabBar显示到屏幕的最前端
[self customizeInterface]; //自定义设置,如UINavigationBar的Appearance
隐藏tabbar
[[self rdv_tabBarController] setTabBarHidden:YES animated:YES];
rdv_tabBarController的实现原理
代码中include
RDVTabBarController.h,而不需要继承或扩展
RDVTabBarController再使用,因为直接通过
rdv_tabBarController就可以访问到,因为:
- (void)rdv_setTabBarController:(RDVTabBarController *)tabBarController {
objc_setAssociatedObject(self, @selector(rdv_tabBarController), tabBarController, OBJC_ASSOCIATION_ASSIGN);
}
- (void)setViewControllers:(NSArray *)viewControllers {
。。。
for (UIViewController *viewController in viewControllers) {
[viewController rdv_setTabBarController:self]; //将自己RDVTabBarController分表关联到每个UITableViewController
。。。
tabbar和tabView的关联,关联直接以每个tabView实际函数为关联Key;
objc_setAssociatedObject(源对象,关键字,关联的对象和一个关联策略)
- (RDVTabBarController *)rdv_tabBarController {
RDVTabBarController *tabBarController = objc_getAssociatedObject(self, @selector(rdv_tabBarController));
。。。
所以在每个UITableViewController中用rdv_tabBarController就访问到tabbar
rdv_tabBarItem实现原理
在
rdv_tabBarController基础上直接访问到
tabView对应的
tabBarItem,所以
tabView中直接通过
rdv_tabBarItem访问到对应的
tabBarItem
实例代码中的切图
[navigationBarAppearance setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault];
竖屏横屏都有,横屏导航条变宽,则自动repeat图片(切图覆盖整个frame,一般切图宽度都是1)
源码地址