一種容器視圖控制器,用於管理收音機式(切換顯示的內容相似收音機切換頻道)的選擇界面,根據選擇來肯定要顯示哪一個子視圖控制器。ios
UITabBarController對象會在窗口底部顯示一個具備標籤的標籤欄界面,用於在不一樣模式之間進行選擇,並顯示該模式的視圖。這個類一般按原樣使用,但也能夠被子類化。編程
標籤欄控制器接口中的每一個標籤都與一個自定義視圖控制器相關聯。當用戶選擇一個特定的標籤時,標籤欄控制器顯示相應的視圖控制器的根視圖,取代之前的任何視圖(用戶點擊老是顯示標籤的根視圖,不管以前選擇了哪一個標籤。即便標籤已經被選中,狀況也是如此)。由於選擇一個標籤將替換接口的內容,因此每一個標籤中管理的接口類型在任何方面都不須要類似。實際上,標籤欄界面一般用於表示不一樣類型的信息,或者使用徹底不一樣的界面樣式表示相同的信息。數組
永遠不要直接訪問標籤欄控制器的標籤欄視圖。要配置標籤欄控制器的標籤,能夠將爲每一個標籤提供根視圖的視圖控制器分配給viewControllers屬性。指定視圖控制器的順序決定了它們在標籤欄中出現的順序。當設置這個屬性時,也應該給selectedViewController屬性賦一個值來指示最初被選擇的視圖控制器。(也可使用selectedIndex屬性經過數組索引來選擇視圖控制器。)在應用程序窗口中嵌入標籤欄控制器的視圖(使用繼承的視圖屬性獲取)時,標籤欄控制器會自動選擇該視圖控制器並顯示其內容,根據須要調整其大小以適應標籤欄界面。markdown
標籤欄的每一項是經過與它們對應的視圖控制器配置的。要將標籤欄項與視圖控制器關聯,須要建立一個UITabBarItem類的新實例,爲視圖控制器適當地配置它,並將它分配給視圖控制器的tabBarItem屬性。若是沒有爲視圖控制器提供一個自定義標籤欄項,視圖控制器會從視圖控制器的title屬性建立一個不包含圖像和文本的默認項。app
當用戶與標籤欄界面交互時,標籤欄控制器對象向其代理髮送關於交互的通知。代理能夠是您指定的任何對象,但必須遵照UITabBarControllerDelegate協議。可使用代理來防止特定的標籤欄項被選中,並在標籤被選中時執行其餘任務。還可使用委託來監視More導航控制器對標籤欄所作的更改。框架
@property(nullable, nonatomic,copy) NSArray<__kindof UIViewController *> *viewControllers;函數
屬性描述:標籤欄界面顯示的根視圖控制器數組。此屬性的默認值爲nil。配置標籤欄控制器時,可使用此屬性爲標籤欄界面的每一個標籤指定內容。視圖控制器在數組中的順序對應於標籤欄中的顯示順序。所以,索引爲0的控制器對應最左邊的標籤,索引爲1的控制器對應右邊的下一個標籤,以此類推。若是有多於標籤欄的視圖控制器,在數組末尾的視圖控制器被more(更多)導航控制器管理,但more(更多)導航控制器自己不包括在這個數組中。工具
@property(nullable, nonatomic,copy) NSArray<__kindof UIViewController *> *viewControllers;
複製代碼
@property(nullable, nonatomic, assign) __kindof UIViewController *selectedViewController;動畫
屬性描述 : 與當前所選標籤項關聯的視圖控制器。此視圖控制器的自定義視圖當前由標籤欄界面顯示。指定的視圖控制器必須在viewControllers數組中。將新視圖控制器指定給此屬性將更改當前顯示的視圖,並在標籤欄中選擇適當的標籤。更改視圖控制器也會相應地更新selectedIndex屬性。此屬性的默認值爲nil。在iOS 3.0及更高版本中,可使用此屬性在viewControllers屬性中選擇任何視圖控制器。這包括由more(更多)控制器管理且其選項卡欄項在選項卡欄中不可見的視圖控制器。您還可使用它來選擇More NavigationController自己,該控制器能夠從moreNavigationController屬性中得到。ui
@property(nullable, nonatomic, assign) __kindof UIViewController *selectedViewController;
複製代碼
@property(nonatomic) NSUInteger selectedIndex;
屬性描述 : 與當前所選標籤項關聯的視圖控制器的索引。此屬性名義上表示viewControllers屬性數組的索引。可是,若是選定的視圖控制器當前是more(更多)導航控制器,則此屬性包含值NSNotFound。設置此屬性會將選定的視圖控制器更改成viewControllers數組中指定索引處的視圖控制器。要選擇更多導航控制器自己,必須更改selectedViewController屬性的值。
@property(nonatomic) NSUInteger selectedIndex;
複製代碼
@property(nonatomic, readonly) UINavigationController *moreNavigationController API_UNAVAILABLE(tvOS);
屬性描述 : 管理更多導航界面的視圖控制器。這個屬性老是包含一個有效的More(更多)導航控制器,即便屏幕上沒有顯示More(更多)按鈕。你可使用這個屬性的值在標籤欄界面中選擇更多的導航控制器,或者將它與當前選擇的視圖控制器進行比較。
不要將存儲在此屬性中的對象手動添加到標籤欄界面。根據須要,More(更多)控制器會自動顯示在標籤欄控制器上。你也不能在viewControllers屬性中存儲的視圖控制器數組中尋找More(更多)導航控制器。標籤欄控制器在對象數組中不包括More(更多)導航控制器。
@property(nonatomic, readonly) UINavigationController *moreNavigationController API_UNAVAILABLE(tvOS);
複製代碼
@property(nullable, nonatomic, copy) NSArray<__kindof UIViewController *> *customizableViewControllers API_UNAVAILABLE(tvOS);
屬性描述:此標籤欄控制器管理的可自定義視圖控制器的子集。此屬性控制用戶能夠從新排列標籤欄中的哪些項。當用戶點擊標籤欄視圖上的「更多」時,將出現一個自定義界面,顯示不適合主標籤欄的任何項。此界面還包含一個編輯按鈕,容許用戶從新排列項。只能今後界面從新排列其關聯視圖控制器在此數組中的項。若是數組爲空或此屬性的值爲nil,則選項卡欄不容許從新排列任何項。更改viewControllers屬性的值(直接或使用setViewControllers:animated:方法)也會更改此屬性的值。首次指定給標籤欄控制器時,默認狀況下,全部視圖控制器都是可自定義的。
@property(nullable, nonatomic, copy) NSArray<__kindof UIViewController *> *customizableViewControllers API_UNAVAILABLE(tvOS);
複製代碼
@property(nonatomic,readonly) UITabBar *tabBar API_AVAILABLE(ios(3.0));
屬性描述 : 與此控制器關聯的標籤欄視圖。不該嘗試操做此屬性中存儲的UITabBar對象自己。若是嘗試這樣作,標籤欄視圖會拋出一個異常。若要爲標籤欄界面配置項,應改成將一個或多個自定義視圖控制器指定給viewControllers屬性。標籤欄從指定的視圖控制器收集所需的標籤欄項目。
@property(nonatomic,readonly) UITabBar *tabBar API_AVAILABLE(ios(3.0));
複製代碼
@property(nullable, nonatomic,weak) id delegate;
屬性描述 : 標籤欄控制器的代理對象。可使用代理對象跟蹤對標籤欄中項的更改,並監視標籤項的選擇。提供的代理對象應該符合UITabBarControllerDelegate協議。此屬性的默認值爲nil。
@property(nullable, nonatomic,weak) id<UITabBarControllerDelegate> delegate;
複製代碼
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController API_AVAILABLE(ios(3.0));
函數描述:詢問代理是否應該將指定的視圖控制器設置爲活動狀態。標籤欄控制器調用此方法以響應用戶單擊標籤欄的某一項。可使用此方法動態地決定是否將給定的標籤設置爲活動狀態標籤。
參數:
tabBarController :包含viewController的標籤欄控制器。
viewController : 屬於用戶點擊的標籤的視圖控制器。
返回值 : 若是視圖控制器的標籤應該被選中,則返回YES,若是當前已經選中的標籤應該保持活動狀態(保持已經選中的標籤保持着選中狀態),則返回NO。
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController API_AVAILABLE(ios(3.0));
複製代碼
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController;
函數描述 : 告訴委託用戶在標籤欄中選擇了一個標籤項。在iOS v3.0及之後版本中,不管所選的視圖控制器是否改變,標籤欄控制器會調用這個方法。此外,它只在用戶點擊標籤欄時被調用,當使用代碼以編程方式更改選項卡欄內容時則不會調用此方法。
參數 :
tabBarController : 包含viewController的標籤欄控制器。
viewController:用戶選擇的視圖控制器。在iOS v3.0及更高版本中,這多是已選擇的同一視圖控制器。
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController;
複製代碼
UITabBar標籤欄,能夠在其中顯示一個或多個按鈕的控件,用於在應用程序中的不一樣子任務、視圖或模式之間進行選擇。一般,能夠將標籤欄與UITabBarController對象結合使用,但也能夠將它們用做應用程序中的獨立控件。標籤欄始終顯示在屏幕的下邊緣,並顯示一個或多個UITabBarItem對象的內容。標籤欄的外觀可使用背景圖像或淡色進行自定義,以知足界面的須要。點擊一個項目選擇並高亮顯示該項目,而後使用該項目的選擇爲應用程序啓用相應的模式。
能夠經過編程方式或在Interface Builder中配置標籤欄。UITabBarController對象提供本身的標籤欄對象,使用UITabBarController必須配置提供UITabBar對象。以編程方式建立標籤欄時,請使用initWithFrame:方法或其餘視圖初始值設定項方法來設置其初始配置。使用此類的方法來配置標籤欄的外觀。對於本身建立的標籤欄,還可使用此類的方法來指定標籤欄顯示的項目。
UITabBar類和UIToolbar類具備類似的外觀,但用途不一樣。使用標籤欄(UITabBar)來傳達和更改應用程序的模式。使用工具欄(UIToolbar)向用戶呈現與當前顯示內容相關的一組操做。
@property(nullable, nonatomic, weak) id delegate;
屬性描述 : 標籤欄的代理對象。使用代理來跟蹤標籤欄項的選擇,並響應標籤欄的用戶自定義。該屬性的默認值爲nil。
@property(nullable, nonatomic, weak) id<UITabBarDelegate> delegate;
複製代碼
@property(nullable, nonatomic, copy) NSArray<UITabBarItem *> *items;
屬性描述 : 標籤欄顯示的項目。這個屬性包含一個UITabBarItem對象數組,每一個對象對應一個由標籤欄顯示的標籤。此屬性中項目的順序與屏幕上項目的順序相對應。可使用此屬性來根據須要訪問這些項。
對於建立的標籤欄,能夠將一組新的項分配給該屬性,以更改顯示的項。更改項目將當即替換它們,不須要動畫。若是標籤欄是由UITabBarController對象管理的,則不能修改這個屬性,這樣作會引起異常。當標籤欄屬於標籤欄控制器時,使用標籤欄控制器的方法進行更改。該屬性的默認值爲nil。
@property(nullable, nonatomic, copy) NSArray<UITabBarItem *> *items;
複製代碼
@property(nullable, nonatomic, weak) UITabBarItem *selectedItem;
屬性描述 : 標籤欄上當前選擇的項目。使用此屬性可獲取當前選定的項。若是更改此屬性的值,則標籤欄選擇相應的項,並相應地更新標籤欄的外觀。將屬性設置爲nil以清除選擇。
當一個項目被選中時,標籤欄會在標籤欄項目的selectedImage屬性中顯示圖像。若是設置了selectedImageTintColor屬性,標籤欄也會將該屬性中的顏色應用到選定的圖像上。爲了防止項目的系統着色,使用UIImageRenderingModeAlwaysOriginal渲染模式提供圖像。該屬性的默認值爲nil。
@property(nullable, nonatomic, weak) UITabBarItem *selectedItem;
複製代碼
@property(nullable, nonatomic, strong) UIImage *backgroundImage API_AVAILABLE(ios(5.0)) UI_APPEARANCE_SELECTOR;
屬性描述 : 標籤欄的自定義背景圖像。若是指定了一個可伸縮的背景圖像,則標籤欄將拉伸圖像以填充可用空間。若是圖像不可拉伸且不夠大,沒法填充可用空間,則標籤欄將平鋪圖像。UIImage中的UIImageResizingMode類型決定了拉伸效果,當存在自定義背景圖像時,標籤欄不會在其後面繪製任何模糊效果,即便半透明屬性爲YES。
@property(nullable, nonatomic, strong) UIImage *backgroundImage API_AVAILABLE(ios(5.0)) UI_APPEARANCE_SELECTOR;
複製代碼
@property(nullable, nonatomic, strong) UIImage *shadowImage API_AVAILABLE(ios(6.0)) UI_APPEARANCE_SELECTOR;
屬性描述 : 用於標籤欄的陰影圖像。對於具備自定義背景的標籤欄,可使用此屬性爲標籤欄指定自定義的陰影圖像。陰影圖像位於標籤欄自己的邊界以外,一般位於標籤欄的框架矩形上方或下方。具體位置取決於當前平臺。例如,在iPhone和iPad上,陰影圖像被放置在標籤欄的上方。必須將此屬性與自定義背景圖像結合使用。若是backgroundImage屬性爲nil,則標籤欄將忽略此屬性中的值並使用默認陰影。
@property(nullable, nonatomic, strong) UIImage *shadowImage API_AVAILABLE(ios(6.0)) UI_APPEARANCE_SELECTOR;
複製代碼
@property(nonatomic,getter=isTranslucent) BOOL translucent API_AVAILABLE(ios(7.0));
屬性描述 : 一個布爾值,指示標籤欄是否爲半透明。當標籤欄是半透明的,須要配置視圖控制器的edgesForExtendedLayout和extendedlayoutinclesopaquebars屬性來顯示標籤欄下面的內容。若是標籤欄沒有自定義背景圖像,或者背景圖像的任何像素的alpha值小於1.0,這個屬性的默認值是YES。若是背景圖像是徹底不透明的,則此屬性的默認值爲NO。若是你設置這個屬性爲YES而且自定義背景圖像是徹底不透明的,UIKit應用一個系統定義的不透明度小於1.0的圖像。若是你設置這個屬性爲NO而且背景圖像是透明的,UIKit會添加一個不透明的背景。
@property(nonatomic,getter=isTranslucent) BOOL translucent API_AVAILABLE(ios(7.0));
複製代碼
@property(nonatomic) UITabBarItemPositioning itemPositioning API_AVAILABLE(ios(7.0)) UI_APPEARANCE_SELECTOR API_UNAVAILABLE(tvOS);
屬性描述:標籤欄中標籤欄項的定位方案。這個屬性的默認值UITabBarItemPositioningAutomatic,將根據當前環境致使默認的標籤欄項目定位:
@property(nonatomic) UITabBarItemPositioning itemPositioning API_AVAILABLE(ios(7.0)) UI_APPEARANCE_SELECTOR API_UNAVAILABLE(tvOS);
複製代碼
UITabBarItemPositioning提供的枚舉值:
typedef NS_ENUM(NSInteger, UITabBarItemPositioning) {
//根據用戶界面的習慣用法指定標籤欄項的自動定位,默認值。
UITabBarItemPositioningAutomatic,
//將項目分佈在標籤欄的整個寬度上。當UITabBarItemPositioningAutomatic選項被選中時,標籤欄在水平緊湊環境中使用這種行爲。
UITabBarItemPositioningFill,
//在可用空間中居中放置項目。當UITabBarItemPositioningAutomatic選項被選中時,標籤欄在水平規則環境中使用此行爲。
UITabBarItemPositioningCentered,
} API_AVAILABLE(ios(7.0));
複製代碼
例如,不透明的帶有紅色陰影的標籤欄的代碼片斷
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//建立窗口
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
//設置根控制器
UITabBarController *tabController = [[UITabBarController alloc]init];
//標籤欄的自定義背景圖像
tabController.tabBar.backgroundImage = [self imageWithColor:[UIColor clearColor] size:CGSizeMake(CGRectGetWidth(tabController.view.frame), 0.5)];
//標籤欄的自定義陰影圖像
tabController.tabBar.shadowImage = [self imageWithColor:[UIColor redColor] size:CGSizeMake(CGRectGetWidth(tabController.view.frame), 0.5)];
//標籤欄是否半透明
tabController.tabBar.translucent = NO;
//標籤欄項的定位方式
tabController.tabBar.itemPositioning = UITabBarItemPositioningFill;
self.window.rootViewController = tabController;
//顯示窗口
[self.window makeKeyAndVisible];
return YES;
}
///返回制定大小與顏色的UIImage對象
- (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size {
if (!color ||
size.width <= 0 ||
size.height <= 0) return nil;
CGRect rect = CGRectMake(0, 0, size.width, size.height);
UIGraphicsBeginImageContextWithOptions(rect.size,NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, color.CGColor);
CGContextFillRect(context, rect);
UIImage *image =UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
複製代碼
樣式如圖 :
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;
函數描述 : 當用戶選擇標籤欄某一項時通知代理。
參數 :
tabBar : 標籤欄
item : 被選中的標籤欄項
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;
複製代碼
派生自NSObject,一個抽象超類,用於能夠添加到顯示在屏幕底部的欄上的項。每一項的行爲相似於按鈕(UIButton的實例)。它們有標題、圖像、動做和目標。您還能夠在工具條上啓用和禁用一個項目。
@property(nonatomic,getter=isEnabled) BOOL enabled;
屬性描述 : 一個布爾值,指示是否啓用該項。若是爲「YES」,則該項將被繪製成部分灰色,以代表它已被禁用。默認值爲「YES」。
@property(nonatomic,getter=isEnabled) BOOL enabled;
複製代碼
@property(nullable, nonatomic,copy) NSString *title;
屬性描述 : 項目上顯示的標題。應該在將項目添加到工具欄以前設置此屬性。默認值爲nil。
@property(nullable, nonatomic,copy) NSString *title;
複製代碼
@property(nullable, nonatomic,strong) UIImage *image;
屬性描述 : 用於表示項的圖像。該圖像可用於建立其餘圖像來表示欄上的這個項目——例如,一個選中的和未選中的圖像可能會從該圖像派生出來。在將項添加到工具欄以前,應設置此屬性。默認值爲nil。
@property(nullable, nonatomic,strong) UIImage *image;
複製代碼
@property(nonatomic) UIEdgeInsets imageInsets;
屬性描述 : 圖象在每一個邊緣開始插入的位置(即內間距)。默認值爲UIEdgeInsetsZero。
@property(nonatomic) UIEdgeInsets imageInsets;
複製代碼
例如設置某一項的圖片內間距:
//獲取標籤欄中的某一項
UITabBarItem *tabBarItemCart = self.tabBar.items[0];
//設置該標籤項的圖片內間距
tabBarItemCart.imageInsets = UIEdgeInsetsMake(- 20, 0, 20, 0);
複製代碼
派生自UIBarItem,標籤欄中的一個項目。標籤欄嚴格的以單選模式運行,每次選中一個項目,點擊標籤欄項目將切換標籤欄上方的視圖。也能夠在標籤欄項目上指定一個標記值來添加額外的視覺信息。例如,Messages應用程序在項目上使用一個標記值來顯示新消息的數量。這個類還爲建立項提供了許多系統默認值。
使用initWithTabBarSystemItem:tag:方法建立一個系統項。使用initWithTitle:image:tag:方法建立一個具備指定標題和圖像的自定義項目,該標題和圖像同時用做未選擇和已選擇的圖像。使用initWithTitle:image:selectedImage:方法建立一個帶有指定標題、未選中圖像和選中圖像的自定義項目。
@property(nullable, nonatomic,strong) UIImage *selectedImage API_AVAILABLE(ios(7.0));
屬性描述 : 選中標籤欄項時顯示的圖像。若是爲nil,則超類UIBarItem上的image屬性的值將同時用做未選定圖像和選定圖像。默認狀況下,實際選定的圖像是根據源圖像中的alpha值自動建立的。要防止系統着色,請爲圖像提供UIImageRenderingModeAlwaysOriginal。
@property(nullable, nonatomic,strong) UIImage *selectedImage API_AVAILABLE(ios(7.0));
複製代碼
@property(nullable, nonatomic, copy) NSString *badgeValue;
屬性描述 : 顯示在項目右上角並帶有周圍紅色橢圓形的文本。默認值爲nil。
@property(nullable, nonatomic, copy) NSString *badgeValue;
複製代碼
@property (nonatomic, readwrite, copy, nullable) UIColor *badgeColor API_AVAILABLE(ios(10.0)) UI_APPEARANCE_SELECTOR;
屬性描述 : 顯示在項目右上角的文本的周圍橢圓形的背景色,若是未爲該屬性指定值,則默認使用紅色背景顏色。
@property (nonatomic, readwrite, copy, nullable) UIColor *badgeColor API_AVAILABLE(ios(10.0)) UI_APPEARANCE_SELECTOR;
複製代碼
標記值文本的樣式:
UITabBarItem的部分屬性還能夠經過KVC的方式進行訪問,例如給UITabBarItem中的imageView屬性添加一個簡單的動畫:
//找到購物車標籤項
UITabBarItem *tabBarItemCart = rootController.tabBar.items[rootController.cartIndex];
//找到購物車圖標視圖
UIImageView *cartView = [[tabBarItemCart valueForKey:@"_view"]valueForKey:@"_imageView"];
//標籤欄購物車視圖縮放動畫
[cartView.layer addAnimation:[self scaleAnimationFromValue:1.0 toValue:1.2 duration:0.1f fillMode:kCAFillModeRemoved] forKey:@"transform.scale"];
複製代碼
@property(null_resettable, nonatomic, strong) UITabBarItem *tabBarItem;
屬性描述 : 當將視圖控制器添加到標籤欄控制器時,表示視圖控制器的標籤欄項。這是UITabBarItem的惟一實例,建立該實例是爲了在視圖控制器是標籤欄控制器的子級時表示它。第一次訪問屬性時,將建立UITabBarItem。所以,若是不使用標籤欄來顯示控制器,則不該顯示該標籤。
@property(null_resettable, nonatomic, strong) UITabBarItem *tabBarItem;
複製代碼
例如:設置標籤欄控制器中某一視圖控制器的標籤項的代碼片斷:
//設置標題
controller.tabBarItem.title = @"發佈";
//設置圖片
controller.tabBarItem.image = [UIImage imageNamed:@"tab_cart_normal"];
//設置選中時的圖片
controller.tabBarItem.selectedImage = [UIImage imageNamed:@"tab_cart_selected"];
複製代碼
@property(nullable, nonatomic, readonly, strong) UITabBarController *tabBarController;
屬性描述 : 在層次結構中做爲視圖控制器的父控制器的最近的標籤欄控制器,若是視圖控制器或其父控制器之一是標籤欄控制器的子級,則此屬性包含所屬的標籤欄控制器。
@property(nullable, nonatomic, readonly, strong) UITabBarController *tabBarController;
複製代碼
#import "AppDelegate.h"
#import "WGEssenceViewController.h"
#import "WGNewViewController.h"
#import "WGPublishViewController.h"
#import "WGFriendTrendViewController.h"
#import "WGMeViewController.h"
@interface AppDelegate ()<UITabBarControllerDelegate>
@property (nonatomic, strong) UIViewController *controller;//記錄選中的新帖控制器
@end
@implementation AppDelegate
///程序啓動時就會調用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//建立窗口
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
//設置根控制器
UITabBarController *tabController = [[UITabBarController alloc]init];
//設置代理
tabController.delegate = self;
//標籤欄的自定義背景圖像
tabController.tabBar.backgroundImage = [self imageWithColor:[UIColor clearColor] size:CGSizeMake(CGRectGetWidth(tabController.view.frame), 0.5)];
//標籤欄的自定義陰影圖像
tabController.tabBar.shadowImage = [self imageWithColor:[UIColor redColor] size:CGSizeMake(CGRectGetWidth(tabController.view.frame), 0.5)];
//標籤欄是否半透明
tabController.tabBar.translucent = NO;
//標籤欄項的定位方式
tabController.tabBar.itemPositioning = UITabBarItemPositioningFill;
self.window.rootViewController = tabController;
//添加五個子控制器
//精華
WGEssenceViewController *essenceViewController = [[WGEssenceViewController alloc]init];
[self tabBarControll:tabController addControllerToNavigationController:essenceViewController withWhetherNavigation:YES];
//新帖
WGNewViewController *newViewController = [[WGNewViewController alloc]init];
[self tabBarControll:tabController addControllerToNavigationController:newViewController withWhetherNavigation:YES];
//發佈
WGPublishViewController *publishViewController = [[WGPublishViewController alloc]init];
[self tabBarControll:tabController addControllerToNavigationController:publishViewController withWhetherNavigation:NO];
//關注
WGFriendTrendViewController *friendTrendViewController = [[WGFriendTrendViewController alloc]init];
[self tabBarControll:tabController addControllerToNavigationController:friendTrendViewController withWhetherNavigation:YES];
//我
WGMeViewController *meViewController = [[WGMeViewController alloc]init];
[self tabBarControll:tabController addControllerToNavigationController:meViewController withWhetherNavigation:YES];
//顯示窗口
[self.window makeKeyAndVisible];
return YES;
}
///導航欄添加控制器
- (void)tabBarControll:(UITabBarController *)tabBarController addControllerToNavigationController:(UIViewController *)controller withWhetherNavigation:(BOOL)whetherNavigation{
//判斷是不是導航控制器
if(whetherNavigation){
//導航控制器
UINavigationController *navigationController = [[UINavigationController alloc]initWithRootViewController:controller];
[tabBarController addChildViewController:navigationController];
//設置導航欄上的按鈕 -> 由對應子控制器的tabBarItem屬性
if([controller isMemberOfClass:[WGEssenceViewController class]]){
navigationController.tabBarItem.title = @"精華";
navigationController.tabBarItem.image = [UIImage imageNamed:@"tab_home_normal"];
navigationController.tabBarItem.selectedImage = [UIImage imageNamed:@"tab_home_index"];
navigationController.tabBarItem.tag = 5000;
}
if([controller isMemberOfClass:[WGNewViewController class]]){
navigationController.tabBarItem.title = @"新帖";
navigationController.tabBarItem.image = [UIImage imageNamed:@"tab_category_normal"];
navigationController.tabBarItem.selectedImage = [UIImage imageNamed:@"tab_category_selected"];
navigationController.tabBarItem.badgeValue = @"5";
navigationController.tabBarItem.badgeColor = [UIColor purpleColor];
navigationController.tabBarItem.tag = 5001;
}
if([controller isMemberOfClass:[WGFriendTrendViewController class]]){
navigationController.tabBarItem.title = @"關注";
navigationController.tabBarItem.image = [UIImage imageNamed:@"tab_location_normal"];
navigationController.tabBarItem.selectedImage = [UIImage imageNamed:@"tab_location_selected"];
navigationController.tabBarItem.tag = 5002;
}
if([controller isMemberOfClass:[WGMeViewController class]]){
navigationController.tabBarItem.title = @"個人";
navigationController.tabBarItem.image = [UIImage imageNamed:@"tab_user_normal"];
navigationController.tabBarItem.selectedImage = [UIImage imageNamed:@"tab_user_selected"];
navigationController.tabBarItem.tag = 5003;
}
}else{
//視圖控制器
if([controller isMemberOfClass:[WGPublishViewController class]]){
controller.tabBarItem.title = @"發佈";
controller.tabBarItem.image = [UIImage imageNamed:@"tab_cart_normal"];
controller.tabBarItem.selectedImage = [UIImage imageNamed:@"tab_cart_selected"];
controller.tabBarItem.tag = 5004;
}
[tabBarController addChildViewController:controller];
}
}
///返回制定大小與顏色的UIImage對象
- (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size {
if (!color ||
size.width <= 0 ||
size.height <= 0) return nil;
CGRect rect = CGRectMake(0, 0, size.width, size.height);
UIGraphicsBeginImageContextWithOptions(rect.size,NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, color.CGColor);
CGContextFillRect(context, rect);
UIImage *image =UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
#pragma mark -- UITabBarControllerDelegate
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{
if(viewController.tabBarItem.tag == 5003){
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"你是過不去的" message:nil preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *yesAction = [UIAlertAction actionWithTitle:@"YES" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action){
NSLog(@"Top YES Button");
}];
[alert addAction:yesAction];
[self.window.rootViewController presentViewController:alert animated:true completion:nil];
return NO;
}else{
return YES;
}
}
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
//若是點擊了新帖
if(viewController.tabBarItem.tag == 5001){
//隱藏標籤欄項的標記值
viewController.tabBarItem.badgeValue = nil;
//記錄點擊的新帖控制器
self.controller = viewController;
}else{
//點擊的不是新帖控制器時,恢復新帖標籤項的標記值
self.controller.tabBarItem.badgeValue = @"5";
}
}
@end
複製代碼
樣式如圖: