TabbarController進行模塊分類和管理

来源:http://www.cnblogs.com/xuzb/archive/2017/12/04/7978216.html
-Advertisement-
Play Games

iOS-CYLTabBarController【好用的TabbarController】 用TabbarController進行模塊分類和管理,這裡推薦一個CYLTabBarController,只需兩個數組就可以使用和管理; 1.導入CYLTabBarController 使用cocoapods導 ...


 

iOS-CYLTabBarController【好用的TabbarController】

 

 

 

用TabbarController進行模塊分類和管理,這裡推薦一個CYLTabBarController,只需兩個數組就可以使用和管理;

 

1.導入CYLTabBarController

使用cocoapods導入即可 pod 'CYLTabBarController', '~> 1.14.1',終端 pod install 即可

 

2.配置

新建一個基於 NSObject 類 MainTabBarControllerConfig,用於配置CYLTabBarController及管理;頭文件引入

#import <CYLTabBarController.h>

.h

@interface MainTabBarControllerConfig : NSObject
///CYLTabBarController @property (nonatomic,strong) CYLTabBarController *mainTabBarController; @end

.m

複製代碼
@implementation MainTabBarControllerConfig

- (CYLTabBarController *)mainTabBarController{
    if (!_mainTabBarController) {
        UIEdgeInsets imageInsets = UIEdgeInsetsZero;
        UIOffset titlePositionAdjustment = UIOffsetZero;
        _mainTabBarController = [CYLTabBarController tabBarControllerWithViewControllers:[self arrayViewControllerItem] tabBarItemsAttributes:[self arrayAttributesItem] imageInsets:imageInsets titlePositionAdjustment:titlePositionAdjustment];
        [self customizeTabBarAppearance:_mainTabBarController];
    }
    return _mainTabBarController;
}

- (NSArray *)arrayViewControllerItem{
    BookcaseNavViewController *bookcaseNavi = [wkj_getSboardBookcase instantiateViewControllerWithIdentifier:@"BookcaseNavViewController"];
    AskKaoLaNavViewController *askKlNavi = [wkj_getSboardAskKaoLa instantiateViewControllerWithIdentifier:@"AskKaoLaNavViewController"];
    DiscoverNavViewController *discoverNavi = [wkj_getSboardDiscover instantiateViewControllerWithIdentifier:@"DiscoverNavViewController"];
    UserNavViewController *userNavi = [wkj_getSboardUser instantiateViewControllerWithIdentifier:@"UserNavViewController"];
    ///返回需要載入的模塊
    return @[bookcaseNavi,discoverNavi,askKlNavi,userNavi];
}

- (NSArray *)arrayAttributesItem{
    NSDictionary *bookcaseItemsAttributes =@{CYLTabBarItemTitle : @"nav1",
                                                CYLTabBarItemImage : @"bar_tk_01",
                                                /* NSString and UIImage are supported*/
                                                CYLTabBarItemSelectedImage : @"bar_tk_02",};
    
    NSDictionary *discoverItemsAttributes = @{CYLTabBarItemTitle : @"nav2",
                                              CYLTabBarItemImage : @"bar_kc_01",
                                              CYLTabBarItemSelectedImage : @"bar_kc_02",};
    
    NSDictionary *askklItemsAttributes = @{CYLTabBarItemTitle : @"nav3",
                                           CYLTabBarItemImage : @"bar_dzs_01",
                                           CYLTabBarItemSelectedImage : @"bar_dzs_02",};
    
    NSDictionary *userItemsAttributes = @{CYLTabBarItemTitle : @"nav4",
                                          CYLTabBarItemImage : @"bar_wd_01",
                                          CYLTabBarItemSelectedImage : @"bar_wd_02"};
    
    NSArray *tabBarItemsAttributes = @[bookcaseItemsAttributes,
                                       discoverItemsAttributes,
                                       askklItemsAttributes,
                                       userItemsAttributes];
    return tabBarItemsAttributes;
}


/**
 *  更多TabBar自定義設置:比如:tabBarItem 的選中和不選中文字和背景圖片屬性、tabbar 背景圖片屬性等等
 */
- (void)customizeTabBarAppearance:(CYLTabBarController *)tabBarController {
    // Customize UITabBar height
    // 自定義 TabBar 高度
    //     tabBarController.tabBarHeight = CYLTabBarControllerHeight;
    
    // set the text color for unselected state
    // 普通狀態下的文字屬性
    NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];
    normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];
    
    // set the text color for selected state
    // 選中狀態下的文字屬性
    NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];
    selectedAttrs[NSForegroundColorAttributeName] = Wonderful_BlueColor6;
    
    // set the text Attributes
    // 設置文字屬性
    UITabBarItem *tabBar = [UITabBarItem appearance];
    [tabBar setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];
    [tabBar setTitleTextAttributes:selectedAttrs forState:UIControlStateSelected];
    
    // Set the dark color to selected tab (the dimmed background)
    // TabBarItem選中後的背景顏色
    // [self customizeTabBarSelectionIndicatorImage];
    
    // update TabBar when TabBarItem width did update
    // If your app need support UIDeviceOrientationLandscapeLeft or UIDeviceOrientationLandscapeRight,
    // remove the comment '//'
    // 如果你的App需要支持橫豎屏,請使用該方法移除註釋 '//'
    // [self updateTabBarCustomizationWhenTabBarItemWidthDidUpdate];
    
    // set the bar shadow image
    // This shadow image attribute is ignored if the tab bar does not also have a custom background image.So at least set somthing.
    [[UITabBar appearance] setBackgroundImage:[[UIImage alloc] init]];
    [[UITabBar appearance] setBackgroundColor:[UIColor whiteColor]];
    [[UITabBar appearance] setShadowImage:[UIImage imageNamed:@"tapbar_top_line"]];
    
    // set the bar background image
    // 設置背景圖片
    //     UITabBar *tabBarAppearance = [UITabBar appearance];
    //     [tabBarAppearance setBackgroundImage:[UIImage imageNamed:@"tab_bar"]];
    
    // remove the bar system shadow image
    // 去除 TabBar 自帶的頂部陰影
    // [[UITabBar appearance] setShadowImage:[[UIImage alloc] init]];
}
複製代碼

 

3.使用

在AppDelegate.m  didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中

複製代碼
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
//    /載入中間自定義按鈕
//    [TabbarPlusButton registerPlusButton];
    MainTabBarControllerConfig *tabbarConfig = [[MainTabBarControllerConfig alloc]init];
    CYLTabBarController *mainTabbarController = tabbarConfig.mainTabBarController;
    [self.window setRootViewController:mainTabbarController];
    return YES;
}
複製代碼

 

 

 

4.自定義按鈕

加入中間按鈕之前,確保上面的功能已經實現;新建一個基於 CYLPlusButton 的類 TabbarPlusButton,實現代理 CYLPlusButtonSubclassing

 .h

@interface TabbarPlusButton : CYLPlusButton<CYLPlusButtonSubclassing>

@end

.m

複製代碼
@implementation TabbarPlusButton

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.titleLabel.textAlignment = NSTextAlignmentCenter;
        self.adjustsImageWhenHighlighted = NO;
    }
    return self;
}

//上下結構的 button
- (void)layoutSubviews {
    [super layoutSubviews];
    
    // 控制項大小,間距大小
    // 註意:一定要根據項目中的圖片去調整下麵的0.7和0.9,Demo之所以這麼設置,因為demo中的 plusButton 的 icon 不是正方形。
    CGFloat const imageViewEdgeWidth   = self.bounds.size.width * 0.7;
    CGFloat const imageViewEdgeHeight  = imageViewEdgeWidth * 0.9;
    
    CGFloat const centerOfView    = self.bounds.size.width * 0.5;
    CGFloat const labelLineHeight = self.titleLabel.font.lineHeight;
    CGFloat const verticalMargin  = (self.bounds.size.height - labelLineHeight - imageViewEdgeHeight) * 0.5;
    
    // imageView 和 titleLabel 中心的 Y 值
    CGFloat const centerOfImageView  = verticalMargin + imageViewEdgeHeight * 0.5;
    CGFloat const centerOfTitleLabel = imageViewEdgeHeight  + verticalMargin * 2 + labelLineHeight * 0.5 + 5;
    
    //imageView position 位置
    self.imageView.bounds = CGRectMake(0, 0, imageViewEdgeWidth, imageViewEdgeHeight);
    self.imageView.center = CGPointMake(centerOfView, centerOfImageView);
    
    //title position 位置
    self.titleLabel.bounds = CGRectMake(0, 0, self.bounds.size.width, labelLineHeight);
    self.titleLabel.center = CGPointMake(centerOfView, centerOfTitleLabel);
}

#pragma mark -
#pragma mark - CYLPlusButtonSubclassing Methods

/*
 *
 Create a custom UIButton with title and add it to the center of our tab bar
 *
 */
+ (id)plusButton {
    TabbarPlusButton *button = [[TabbarPlusButton alloc] init];
///中間按鈕圖片 UIImage *buttonImage = [UIImage imageNamed:@"post_normal"]; [button setImage:buttonImage forState:UIControlStateNormal]; [button setTitle:@"發佈" forState:UIControlStateNormal]; [button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal]; [button setTitle:@"發佈" forState:UIControlStateSelected]; [button setTitleColor:[UIColor blueColor] forState:UIControlStateSelected]; button.titleLabel.font = [UIFont systemFontOfSize:9.5]; [button sizeToFit]; // or set frame in this way `button.frame = CGRectMake(0.0, 0.0, 250, 100);` // button.frame = CGRectMake(0.0, 0.0, 250, 100); // button.backgroundColor = [UIColor redColor]; // if you use `+plusChildViewController` , do not addTarget to plusButton. [button addTarget:button action:@selector(clickPublish) forControlEvents:UIControlEventTouchUpInside]; return button; } /* * Create a custom UIButton without title and add it to the center of our tab bar * */ //+ (id)plusButton //{ // // UIImage *buttonImage = [UIImage imageNamed:@"hood.png"]; // UIImage *highlightImage = [UIImage imageNamed:@"hood-selected.png"]; // // CYLPlusButtonSubclass* button = [CYLPlusButtonSubclass buttonWithType:UIButtonTypeCustom]; // // button.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin; // button.frame = CGRectMake(0.0, 0.0, buttonImage.size.width, buttonImage.size.height); // [button setBackgroundImage:buttonImage forState:UIControlStateNormal]; // [button setBackgroundImage:highlightImage forState:UIControlStateHighlighted]; // [button addTarget:button action:@selector(clickPublish) forControlEvents:UIControlEventTouchUpInside]; // // return button; //} #pragma mark - #pragma mark - Event Response - (void)clickPublish { CYLTabBarController *tabBarController = [self cyl_tabBarController]; UIViewController *viewController = tabBarController.selectedViewController; UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"拍照", @"從相冊選取", @"淘寶一鍵轉賣", nil]; [actionSheet showInView:viewController.view]; } #pragma mark - UIActionSheetDelegate - (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex { NSLog(@"buttonIndex = %@", @(buttonIndex)); } #pragma mark - CYLPlusButtonSubclassing //+ (UIViewController *)plusChildViewController { // UIViewController *plusChildViewController = [[UIViewController alloc] init]; // plusChildViewController.view.backgroundColor = [UIColor redColor]; // plusChildViewController.navigationItem.title = @"PlusChildViewController"; // UIViewController *plusChildNavigationController = [[UINavigationController alloc] // initWithRootViewController:plusChildViewController]; // return plusChildNavigationController; //} // //+ (NSUInteger)indexOfPlusButtonInTabBar { // return 4; //} // //+ (BOOL)shouldSelectPlusChildViewController { // BOOL isSelected = CYLExternPlusButton.selected; // if (isSelected) { // NSLog(@"
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為什麼配置skip-name-resolve? 由於mysql -h${ip} 遠程訪問速度過慢, 根據網友經驗(https://www.cnblogs.com/yjf512/p/3803762.html), 重啟mysql,發現遠程訪問msyql速度上來了,解決問題。 然而引發了新的問題: 但是卻 ...
  • 1、為什麼使用觸發器 2、創建觸發器 2.1 創建有一條執行語句的觸發器 例子:在資料庫company中存在兩個表對象:部門表(t_dept)和日記表(t_diary),創建觸發器實現向部門表中插入記錄時,就會在插入之前嚮日記表中插入當前時間。 部門表: 日記表: 創建觸發器: 插入記錄: 結果:日 ...
  • 存儲過程和存儲函數是指存儲在資料庫中供所有用戶程式調用的子程式叫存儲過程、存儲函數。 ...
  • 觸發器是一種特殊的存儲過程,和存儲過程和存儲函數一樣是一個pl/sql程式塊,觸發器是不能接受參數,不能顯示調用,只是隨著事件觸發隱式運行的存儲過程程式塊。 ...
  • 一、背景 由於項目的業務是不斷往前跑的,所以難免資料庫的表的量會越來越龐大,不斷的擠占硬碟空間。即使再大的空間也支撐不起業務的增長,所以定期刪除不必要的數據是很有必要的。在我們項目中由於不清理數據,一個表占的空間竟然達到了4G之多。想想有多可怕... 這裡介紹的是用MySQL 建立一個定時器Even ...
  • iOS UILabel控制項預設文字位置是居中的,如圖所示: 但是我們經常碰到這樣的需求,希望文字向上置頂,或者向下置底,但是很遺憾,iOS API中並沒有提供相應的屬性和方法,需要我們手動設置。 利用 分類(category)為UILabel添加屬性 isTop 和 isBottom來控制文字是否置 ...
  • 一,工程圖。 二,代碼。 ...
  • Android文件操作 私有文件 備註 因為手機內部存儲的根目錄是只讀的,所以需要根據規範(/data/data/報名/... )創建文件到APP私有文件夾 filesDir (data/data/包名/files) 用來保存重要的配置文件 cacheDir (data/data/包名/cache) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...