【低耦合集成TabBarController】最低只需傳兩個數組便可完成主流App框架搭建

Github倉庫地址戳這裏git

CocoaPods 版本 v1.0.1
Objective-C
iOS6+

導航

  1. 與其餘自定義TabBarController的區別github

  2. 集成後的效果數組

  3. 使用CYLTabBarController微信

    1. 第一步:使用cocoaPods導入CYLTabBarController app

    2. 第二步:設置CYLTabBarController的兩個數組:控制器數組和TabBar屬性數組框架

    3. 第三步:將CYLTabBarController設置爲window的RootViewControllersvg

    4. 第四步(可選):建立自定義的形狀不規則加號按鈕學習

  4. 補充說明spa

與其餘自定義TabBarController的區別

- 特色 解釋
1 低耦合 與業務徹底分離,最低只需傳兩個數組便可完成主流App框架搭建
2 TabBar內均使用系統的TabbarItem ,並不是UIButton或UIView 無需反覆調「間距位置等」來接近系統效果
3 自動監測是否須要添加「加號」按鈕,並能自動設置位置 CYLTabBarController 既支持相似微信的「中規中矩」的 TabBarController 樣式,而且默認就是微信這種樣式,同時又支持相似「微博」或「淘寶閒魚」這種具備不規則加號按鈕的 TabBarController 。想支持這種樣式,只需自定義一個加號按鈕,CYLTabBarController 能檢測到它的存在並自動將 tabBar 排序好,無需多餘操做,而且也預留了必定接口來知足自定義需求。「加號」按鈕的樣式、frame均在自定義的類中獨立實現,不會涉及tabbar相關設置。
4 即便加號按鈕超出了tabbar的區域,超出部分依然能響應點擊事件 紅線內的區域均能響應tabbar相關的點擊事件,enter image description here
5 支持CocoaPods 容易集成

(學習交流羣:498865024)3d

集成後的效果:

既支持默認樣式 同時也支持建立自定義的形狀不規則加號按鈕
enter image description here enter image description here
本倉庫配套Demo的效果: 另外一個Demo 使用CYLTabBarController實現了微博Tabbar框架,效果以下
enter image description here enter image description here

使用CYLTabBarController

四步完成主流App框架搭建:

  1. 第一步:使用cocoaPods導入CYLTabBarController

  2. 第二步:設置CYLTabBarController的兩個數組:控制器數組和TabBar屬性數組

  3. 第三步:將CYLTabBarController設置爲window的RootViewController

  4. 第四步(可選):建立自定義的形狀不規則加號按鈕

第一步:使用cocoaPods導入CYLTabBarController

Podfile 中以下導入:

pod 'CYLTabBarController'

而後使用 cocoaPods 進行安裝:

建議使用以下方式:

# 不升級CocoaPods的spec倉庫
pod update --verbose

第二步:設置CYLTabBarController的兩個數組:控制器數組和TabBar屬性數組

- (void)setupViewControllers {
   CYLHomeViewController *firstViewController = [[CYLHomeViewController alloc] init];
   UIViewController *firstNavigationController = [[UINavigationController alloc]
                                                  initWithRootViewController:firstViewController];
   
   CYLSameFityViewController *secondViewController = [[CYLSameFityViewController alloc] init];
   UIViewController *secondNavigationController = [[UINavigationController alloc]
                                                   initWithRootViewController:secondViewController];
   

   CYLTabBarController *tabBarController = [[CYLTabBarController alloc] init];
   [self customizeTabBarForController:tabBarController];
   
   [tabBarController setViewControllers:@[
                                          firstNavigationController,
                                          secondNavigationController,
                                          ]];
   self.tabBarController = tabBarController;
}

/*
*
在`-setViewControllers:`以前設置TabBar的屬性,
*
*/
- (void)customizeTabBarForController:(CYLTabBarController *)tabBarController {
   
   NSDictionary *dict1 = @{
                           CYLTabBarItemTitle : @"首頁",
                           CYLTabBarItemImage : @"home_normal",
                           CYLTabBarItemSelectedImage : @"home_highlight",
                           };
   NSDictionary *dict2 = @{
                           CYLTabBarItemTitle : @"同城",
                           CYLTabBarItemImage : @"mycity_normal",
                           CYLTabBarItemSelectedImage : @"mycity_highlight",
                           };

   NSArray *tabBarItemsAttributes = @[ dict1, dict2 ];
   tabBarController.tabBarItemsAttributes = tabBarItemsAttributes;
}

第三步:將CYLTabBarController設置爲window的RootViewController

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
/* *省略部分:   * */
   [self.window setRootViewController:self.tabBarController];
/* *省略部分:   * */
   return YES;
}

第四步(可選):建立自定義的形狀不規則加號按鈕

建立一個繼承於 CYLPlusButton 的類,要求和步驟:

  1. 實現 CYLPlusButtonSubclassing 協議

  2. 子類將自身類型進行註冊,通常可在 applicationapplicationDelegate 方法裏面調用 [YourClass registerSubClass] 或者在子類的 +load 方法中調用:

    +(void)load {
       [super registerSubclass];
    }

協議提供了兩個可選方法:

+ (NSUInteger)indexOfPlusButtonInTabBar;
+ (CGFloat)multiplerInCenterY;

做用分別是:

+ (NSUInteger)indexOfPlusButtonInTabBar;

用來自定義加號按鈕的位置,若是不實現默認居中,可是若是 tabbar 的個數是奇數則必須實現該方法,不然 CYLTabBarController 會拋出 exception 來進行提示。

+ (CGFloat)multiplerInCenterY;

該方法是爲了調整自定義按鈕中心點Y軸方向的位置,建議在按鈕超出了 tabbar 的邊界時實現該方法。返回值是自定義按鈕中心點Y軸方向的座標除以 tabbar 的高度,若是不實現,會自動進行比對,預設一個較爲合適的位置,若是實現了該方法,預設的邏輯將失效。

詳見Demo中的 CYLPlusButtonSubclass 類的實現。

補充說明

若是想更進一步的自定義 TabBar 樣式可在 -application:didFinishLaunchingWithOptions: 方法中設置

/**
*  tabBarItem 的選中和不選中文字屬性、背景圖片
*/
- (void)customizeInterface {
   
   // 普通狀態下的文字屬性
   NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];
   normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];
   
   // 選中狀態下的文字屬性
   NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];
   selectedAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor];
   
   // 設置文字屬性
   UITabBarItem *tabBar = [UITabBarItem appearance];
   [tabBar setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];
   [tabBar setTitleTextAttributes:normalAttrs forState:UIControlStateHighlighted];
   UITabBar *tabBarAppearance = [UITabBar appearance];
   [tabBarAppearance setBackgroundImage:[UIImage imageNamed:@"tabbar_background"]];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
/* *省略部分:   * */
   [self.window makeKeyAndVisible];
   [self customizeInterface];
   return YES;
}

(更多iOS開發乾貨,歡迎關注 微博@iOS程序犭袁


Posted by 微博@iOS程序犭袁
原創文章,版權聲明:自由轉載-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0

相關文章
相關標籤/搜索