UITabBarController学习笔记

UITabBarController -- 标签栏控制器

一种容器视图控制器,用于管理收音机式(切换显示的内容相似收音机切换频道)的选择界面,根据选择来肯定要显示哪一个子视图控制器。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;
复制代码
UITabBarController提供的经常使用代理函数

- (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 -- 标签栏

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,将根据当前环境致使默认的标签栏项目定位:

  • 在水平紧凑的环境中,标签栏将项目分布在整个空间中,并根据须要调整项目间距。
  • 在水平规则环境中,标签栏使用itemWidth和itemSpacing属性设置项目的宽度和项目之间的间距,并将这些项目定位在可用空间的中心。这种配置可能会在标签栏的左右边缘留出空间。经过将此属性的值更改成不一样的值,能够强制执行特定的定位方案。
@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;
}
复制代码

样式如图 :

截屏2020-12-30下午9.59.21.png

UITabBar提供的经常使用代理函数

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;

函数描述 : 当用户选择标签栏某一项时通知代理。

参数 :

tabBar : 标签栏

item : 被选中的标签栏项

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;
复制代码

UIBarItem -- 标签栏的某一项

派生自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);
复制代码

截屏2021-05-31下午3.12.59.png

UITabBarItem

派生自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;
复制代码

标记值文本的样式:

截屏2020-12-30下午10.17.19.png

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"];
复制代码

Jietu20210226-110712.gif

UIViewController (UITabBarControllerItem) - 标签栏控制器项

经常使用属性

@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

复制代码

样式如图:

Jietu20210131-202953.gif

相关文章
相关标签/搜索