天天看點

RDVTabBarController【iOS源碼閱讀】

源碼說明

RDVTabBarController 是一個定制化的TabBarController庫,可動畫顯示隐藏tabbar欄,可定制tabbar欄   

tarbar加載

  • 在didFinishLaunchingWithOptions中實作
  1. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];    //new UIWindow 
  2. [self setupViewControllers];            //新增RDVTabBarController,調用setViewControllers為其添加多個UITableViewController,并為其設定RDVTabBarItem
  3. [self.window setRootViewController:self.viewController];
  4. [self.window makeKeyAndVisible];    //使RDVTabBar顯示到螢幕的最前端
  5. [self customizeInterface];                //自定義設定,如UINavigationBar的Appearance

隐藏tabbar

  1. [[self rdv_tabBarController] setTabBarHidden:YES animated:YES];

rdv_tabBarController的實作原理

代碼中include  RDVTabBarController.h,而不需要繼承或擴充 RDVTabBarController再使用,因為直接通過 rdv_tabBarController就可以通路到,因為:

  1. - (void)rdv_setTabBarController:(RDVTabBarController *)tabBarController {
  2. objc_setAssociatedObject(self, @selector(rdv_tabBarController), tabBarController, OBJC_ASSOCIATION_ASSIGN);
  3. }
  1. - (void)setViewControllers:(NSArray *)viewControllers {
  2.     。。。
  3.     for (UIViewController *viewController in viewControllers) {
  4.         [viewController rdv_setTabBarController:self];    //将自己RDVTabBarController分表關聯到每個UITableViewController
  5. 。。。

tabbar和tabView的關聯,關聯直接以每個tabView實際函數為關聯Key; objc_setAssociatedObject(源對象,關鍵字,關聯的對象和一個關聯政策)

  1. - (RDVTabBarController *)rdv_tabBarController {
  2.     RDVTabBarController *tabBarController = objc_getAssociatedObject(self, @selector(rdv_tabBarController));
  3. 。。。

是以在每個UITableViewController中用rdv_tabBarController就通路到tabbar

rdv_tabBarItem實作原理

在 rdv_tabBarController基礎上直接通路到 tabView對應的 tabBarItem,是以 tabView中直接通過 rdv_tabBarItem通路到對應的 tabBarItem

執行個體代碼中的切圖

  1. [navigationBarAppearance setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault];

豎屏橫屏都有,橫屏導覽列變寬,則自動repeat圖檔(切圖覆寫整個frame,一般切圖寬度都是1)

源碼位址

  • https://github.com/liaohw/RDVTabBarController