最近想要自定義一個tabbarController
,本篇文章是為了解下原生的工作原理绳锅,參考來源為Developer Documtation
和控制臺調(diào)試那槽。所以下面的思路
含有推測部分,只能表示筆者的思路屿笼。如有錯誤牺荠,請指正。如能告知在哪了解原生控件工作原理刁卜,萬分感激V镜纭!蛔趴!
1. 使用
- 指定管理的子控制器
viewControllers
挑辆,同時可以通過selectedViewController
或selectedIndex
指定默認選中的控制器 - 對于
tabbar
上的標簽控制則通過子控制器的tabbarItem
實現(xiàn)例朱。tabBarController
上的tabBar
屬性(只讀)不能直接修改。 - 通過
UITabBarControllerDelegate
協(xié)議控制或添加交互行為鱼蝉。該協(xié)議可選洒嗤。
注意:tabbar
最多能顯示5個item,超過會將第5個item變?yōu)?code>More魁亦。點擊More
再選擇其他渔隶。
2. 思路
tabbarController
繼承于UIViewController
,子控制器視圖和tabbar
都是添加到該UIViewController
的view
上。切換時將原來的子控制器視圖移除洁奈,將新的視圖添加间唉。
對于More
項,猜測:檢測到控制器數(shù)大于5時利术,新建一個數(shù)組存儲前4項控制器和moreNaviController
呈野,多出的控制器則賦值給。moreNaviController
的viewControllers
創(chuàng)建moreNaviController
同時會創(chuàng)建一個UIMoreListController
用于列出多出的控制器印叁。但是控制臺調(diào)試時被冒,點擊More
時,moreNaviController
的viewControllers
只包含列表控制器轮蜕。當選擇多出的控制器時昨悼,viewControllers
也只包含了列表控制器和選中的控制器。
也即是在多出的控制器間切換時跃洛,更新的是viewControllers
屬性率触,而不是push pop
。我的猜想:由于導航控制器時以棧的形式管理的税课,如果一次性將控制器加到viewControllers
闲延。當根控制器UIMoreListController
依次push
了5,6韩玩,7垒玲,此時要從7回到5,會有多余的入棧出棧行為找颓。
而通過直接更新viewControllers
合愈,也就是直接替換了導航棧,能可直接刷新視圖到viewControllers
的最后一個控制器的視圖击狮。
所以moreNaviController
的viewControllers
是 ?動態(tài)? 調(diào)整的佛析。
3. 屬性
屬性 | 作用 |
---|---|
tabBar | 只讀屬性,僅為用于-[UIActionSheet showFromTabBar:]方法 |
viewControllers | 子控制器 |
customizableViewControllers | 當出現(xiàn)More時彪蓬,可以對各控制器順序重新布置寸莫,該屬性指定哪些控制器能被重新布置,其他的則不能 |
moreNavigationController | More標簽,只讀屬性档冬。通過該屬性可以拿到多出的子控制器 |
selectedViewController | 當前選中的控制器膘茎,可以修改替換成其他的桃纯,包括More |
selectedIndex | 選中的控制器的索引,從左至右從0開始披坏,值和viewControllers的索引相同态坦,修改該屬性也可以切換。但是不能選中More |
4. 協(xié)議UITabBarControllerDelegate
- 指定選中的控制器
- 選中后執(zhí)行方法
// 是否切換到用戶選中的viewController
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController;
// 切換后
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController;
- 自定義控制器順序前(后)要做的事
// 自定排序窗口顯示前
- (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray<__kindof UIViewController *> *)viewControllers;
// 排序窗口退出前
- (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray<__kindof UIViewController *> *)viewControllers changed:(BOOL)changed;
// 結(jié)束排序后(tvOS不可用)
- (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray<__kindof UIViewController *> *)viewControllers changed:(BOOL)changed;
-
tabbar
橫豎屏支持
- (UIInterfaceOrientationMask)tabBarControllerSupportedInterfaceOrientations:(UITabBarController *)tabBarController;
- (UIInterfaceOrientation)tabBarControllerPreferredInterfaceOrientationForPresentation:(UITabBarController *)tabBarController;
- 動畫
- (nullable id <UIViewControllerInteractiveTransitioning>)tabBarController:(UITabBarController *)tabBarController
interactionControllerForAnimationController: (id <UIViewControllerAnimatedTransitioning>)animationController;
// contentController的切換動畫
- (nullable id <UIViewControllerAnimatedTransitioning>)tabBarController:(UITabBarController *)tabBarController
animationControllerForTransitionFromViewController:(UIViewController *)fromVC
toViewController:(UIViewController *)toVC NS_AVAILABLE_IOS(7_0);