阅读 103

UITabBarController学习笔记

UITabBarController -- 标签栏控制器

一种容器视图控制器,用于管理收音机式(切换显示的内容类似收音机切换频道)的选择界面,根据选择来确定要显示哪个子视图控制器。

UITabBarController对象会在窗口底部显示一个具有标签的标签栏界面,用于在不同模式之间进行选择,并显示该模式的视图。这个类通常按原样使用,但也可以被子类化。

标签栏控制器接口中的每个标签都与一个自定义视图控制器相关联。当用户选择一个特定的标签时,标签栏控制器显示相应的视图控制器的根视图,取代以前的任何视图(用户点击总是显示标签的根视图,无论之前选择了哪个标签。即使标签已经被选中,情况也是如此)。因为选择一个标签将替换接口的内容,所以每个标签中管理的接口类型在任何方面都不需要相似。实际上,标签栏界面通常用于表示不同类型的信息,或者使用完全不同的界面样式表示相同的信息。

永远不要直接访问标签栏控制器的标签栏视图。要配置标签栏控制器的标签,可以将为每个标签提供根视图的视图控制器分配给viewControllers属性。指定视图控制器的顺序决定了它们在标签栏中出现的顺序。当设置这个属性时,也应该给selectedViewController属性赋一个值来指示最初被选择的视图控制器。(也可以使用selectedIndex属性通过数组索引来选择视图控制器。)在应用程序窗口中嵌入标签栏控制器的视图(使用继承的视图属性获取)时,标签栏控制器会自动选择该视图控制器并显示其内容,根据需要调整其大小以适应标签栏界面。

标签栏的每一项是通过与它们对应的视图控制器配置的。要将标签栏项与视图控制器关联,需要创建一个UITabBarItem类的新实例,为视图控制器适当地配置它,并将它分配给视图控制器的tabBarItem属性。如果没有为视图控制器提供一个自定义标签栏项,视图控制器会从视图控制器的title属性创建一个不包含图像和文本的默认项。

当用户与标签栏界面交互时,标签栏控制器对象向其代理发送关于交互的通知。代理可以是您指定的任何对象,但必须遵守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属性中获得。

@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<UITabBarControllerDelegate> 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<UITabBarDelegate> 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



作者:寻心_0a46
链接:https://www.jianshu.com/p/00363492f5e6
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐