美文网首页iOS视图
UITabBarController学习笔记

UITabBarController学习笔记

作者: 寻心_0a46 | 来源:发表于2022-05-17 17:55 被阅读0次

    UITabBarController -- 标签栏控制器

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

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

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

    不要通过直接访问UITabBarController的标签栏视图(UITabBar)来配置标签栏视图(UITabBar)显示的标签(UITabBarItem),这可能会引发异常(Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Directly modifying a tab bar managed by a tab bar controller is not allowed.')。要配置标签栏控制器的标签,可以将为每个标签提供根视图的视图控制器分配给viewControllers属性。指定视图控制器的顺序决定了它们在标签栏中出现的顺序。当设置viewControllers这个属性时,也应该给selectedViewController属性赋一个值来指示最初被选择的视图控制器。(也可以使用selectedIndex属性通过数组索引来选择视图控制器。)在应用程序窗口中嵌入标签栏控制器的视图(使用继承的视图属性获取)时,UITabBarController会自动选择该视图控制器并显示其内容,根据需要调整其大小以适应标签栏界面。

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

    当用户与标签栏界面交互时,UITabBarController对象向其代理发送关于交互的通知。代理可以是指定的任何对象,但必须遵守UITabBarControllerDelegate协议。可以使用代理来防止特定的标签栏项被选中,并在标签被选中时执行其他任务。还可以使用代理来监视More(更多)导航控制器对标签栏所做的更改。

    通常(只是通常) UITabBarController作为应用程序的根视图控制器,用以展示不同的模块功能,我们先简单的配置一个呈现图片的标签栏控制器,查看UITabBarController的组成,如下:

    #import "TSRootViewController.h"
    #import "TSChannelOneViewController.h"
    #import "TSChannelTwoViewController.h"
    #import "TSChannelThreeViewController.h"
    
    @interface TSRootViewController ()
    
    @end
    
    @implementation TSRootViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self correctBarConfigure];
    }
    
    /// 正确配置标签栏的方式
    - (void)correctBarConfigure {
        TSChannelOneViewController *oneViewController = [[UIStoryboard storyboardWithName:@"ChannelOne" bundle:nil] instantiateViewControllerWithIdentifier:NSStringFromClass(TSChannelOneViewController.class)];
        oneViewController.tabBarItem = [[UITabBarItem alloc]initWithTitle:@"频道一" image:[UIImage imageNamed:@"icons_poke_ball"] tag:1001];
        oneViewController.tabBarItem.selectedImage = [UIImage imageNamed:@"icons_poke_ball_select"];
        
        TSChannelTwoViewController *twoViewController = [[UIStoryboard storyboardWithName:@"ChannelTwo" bundle:nil] instantiateViewControllerWithIdentifier:NSStringFromClass(TSChannelTwoViewController.class)];
        twoViewController.tabBarItem = [[UITabBarItem alloc]initWithTitle:@"频道二" image:[UIImage imageNamed:@"icons_poke_ball"] tag:1002];
        twoViewController.tabBarItem.selectedImage = [UIImage imageNamed:@"icons_poke_ball_select"];
        
        TSChannelThreeViewController *threeViewController = [[UIStoryboard storyboardWithName:@"ChannelThree" bundle:nil] instantiateViewControllerWithIdentifier:NSStringFromClass(TSChannelThreeViewController.class)];
        threeViewController.tabBarItem = [[UITabBarItem alloc]initWithTitle:@"频道三" image:[UIImage imageNamed:@"icons_poke_ball"] tag:1003];
        threeViewController.tabBarItem.selectedImage = [UIImage imageNamed:@"icons_poke_ball_select"];
        
        self.viewControllers = @[oneViewController,twoViewController,threeViewController];
        self.selectedViewController = twoViewController;
    }
    
    /// 错误配置标签栏的方式
    - (void)errorTabBarConfigure {
        UITabBarItem *channelOneItem = [[UITabBarItem alloc]initWithTitle:@"频道一" image:[UIImage imageNamed:@"PokemonI"] tag:1001];
        UITabBarItem *channelTwoItem = [[UITabBarItem alloc]initWithTitle:@"频道二" image:[UIImage imageNamed:@"PokemonII"] tag:1002];
        UITabBarItem *channelThreeItem = [[UITabBarItem alloc]initWithTitle:@"频道三" image:[UIImage imageNamed:@"PokemonIII"] tag:1003];
        self.tabBar.items = @[channelOneItem,channelTwoItem,channelThreeItem];
    }
    
    @end
    
    截屏2022-04-22 17.09.45.png

    如果UITabBarController添加了五个以上的视图控制器,但标签栏不足以布局全部的标签时,则只会显示前四个,其余部分将在自动生成的More(更多)项下访问。如图:

    截屏2022-04-25 16.27.17.png
    UITabBarController常用属性
    @property(nullable, nonatomic,copy) NSArray<__kindof UIViewController *> *viewControllers;
    

    属性描述:标签栏界面显示的根视图控制器数组。此属性的默认值为nil。配置UITabBarController时,可以使用此属性为标签栏界面(UITabBar)的每个标签(UITabBarItem)指定内容。视图控制器在数组中的顺序对应于标签栏中的显示顺序。因此,索引为0的控制器对应最左边的标签,索引为1的控制器对应右边的下一个标签,以此类推。这个数组中不包含More(更多)项对应的moreNavigationController控制器,即使More(更多)项是显示的。

    @property(nullable, nonatomic, assign) __kindof UIViewController *selectedViewController;
    

    属性描述 : 与当前所选标签项关联的视图控制器。此视图控制器的自定义视图当前由标签栏界面显示。指定的视图控制器必须在viewControllers数组中。将新视图控制器指定给此属性将更改当前显示的视图,并在标签栏中选择适当的标签。更改视图控制器也会相应地更新selectedIndex属性。此属性的默认值为nil。在iOS 3.0及更高版本中,可以使用此属性在viewControllers属性中选择任何视图控制器。也可以选择由moreNavigationController(更多项控制器)管理的在标签栏中(UITabBar)不可见的标签项(UITabBarItem)对应的视图控制器。 还可以使用它来选择moreNavigationController本身,可以从moreNavigationController属性中获得该控制器。

    @property(nonatomic) NSUInteger selectedIndex;
    

    属性描述 : 与当前所选标签项关联的视图控制器的索引。此属性名义上表示viewControllers属性数组的索引。但是,如果选定的视图控制器当前是more(更多)项对应的moreNavigationController,则此属性包含值NSNotFound。设置此属性会将viewControllers数组中指定索引处的视图控制器设置为选定的视图控制器。要选择moreNavigationController,必须更改selectedViewController属性的值

    @property(nonatomic, readonly) UINavigationController *moreNavigationController API_UNAVAILABLE(tvOS);
    

    属性描述 : 管理更多导航界面的视图控制器。这个属性总是包含一个有效的More(更多)导航控制器,即使屏幕上没有显示More(更多)项。可以使用这个属性的值在标签栏界面中选中moreNavigationController,或者将它与当前选中的视图控制器进行比较。

    不要将存储在此属性中的对象手动添加到标签栏界面。根据需要(UITabBarController添加了五个以上的视图控制器,但标签栏不足以布局全部的标签时),More(更多)项会自动添加到标签栏(UITabBar) ,moreNavigationController属性对应的控制器会自动添加到UITabBarController上。你也不能在viewControllers属性中存储的视图控制器数组中寻找moreNavigationController属性存储导航控制器,因为viewControllers属性中不包括moreNavigationController对应的More(更多)导航控制器。

    moreNavigationController对应的More(更多)导航控制器的样式:

    截屏2022-04-27 11.55.05.png
    @property(nullable, nonatomic, copy) NSArray<__kindof UIViewController *> *customizableViewControllers API_UNAVAILABLE(tvOS);
    

    属性描述:当用户点击标签栏视图上的More(更多)项时,将出现一个自定义界面,显示不适合在主标签栏(UITabBar) 中布局的标签项(UITabBarItem)。此界面还包含一个编辑按钮,允许用户重新排列标签项(UITabBarItem)。此数组为存放可自定义进行编辑的视图控制器, 用于控制用户可以重新排列标签栏中的哪些项,与存放在数组中的视图控制器对应的标签项(UITabBarItem)可以在编辑页面重新排列,如果数组为空或此属性的值为nil,则标签栏(UITabBar) 不允许重新排列任何标签项(UITabBarItem)。为此数组应分配视图控制器应为viewControllers的严格子集,更改viewControllers属性的值(直接或使用setViewControllers:animated:方法)也会更改此数组中的元素。未给该数组分配视图控制器数组的情况下,所有视图控制器都是可自定义的(即customizableViewControllers 与viewControllers中的数组元素相同)。

    编辑控制器对应的标签项页面 :

    截屏2022-04-27 15.32.19.png
    @property(nonatomic,readonly) UITabBar *tabBar API_AVAILABLE(ios(3.0));
    

    属性描述 : 与此控制器关联的标签栏(UITabBar)视图。不应尝试操作此属性中存储的UITabBar对象本身。如果尝试这样做,标签栏(UITabBar)视图会抛出一个异常。若要为标签栏(UITabBar)界面配置标签项(UITabBarItem),应改为将一个或多个自定义视图控制器指定给viewControllers属性。标签栏(UITabBar)从指定的视图控制器收集所需的标签栏项目(UITabBarItem)。

    @property(nullable, nonatomic,weak) id<UITabBarControllerDelegate> delegate;
    

    属性描述 : UITabBarController的代理对象。可以使用代理对象跟踪对标签栏(UITabBar)中标签项(UITabBarItem)的更改,并监视标签项(UITabBarItem)的选择。提供的代理对象应该符合UITabBarControllerDelegate协议。此属性的默认值为nil。

    UITabBarController提供的常用代理函数
    - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController API_AVAILABLE(ios(3.0));
    

    函数描述:UITabBarController调用此方法以响应用户单击标签栏(UITabBar)的某一项(UITabBarItem),然后询问代理是否应该将点击的标签项(UITabBarItem)选中并展示与点击的标签项(UITabBarItem)对应的视图控制器。

    参数:

    tabBarController :包含viewController的标签栏控制器。

    viewController : 属于用户点击的标签(UITabBarItem)对应的视图控制器。

    返回值 : 如果当前点击的标签(UITabBarItem)应该被选中,则返回YES, 如果当前点击的标签(UITabBarItem)不应该被选中,则返回NO。

    - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController;
    

    函数描述 :通知代理用户在标签栏中(UITabBar)选择了一个标签项(UITabBarItem),如果选择的标签项(UITabBarItem)可以被选中(询问shouldSelectViewController代理函数),UITabBarController会调用该方法。在iOS v3.0及以后版本中,即使点击已经选中的标签项 (UITabBarItem),UITabBarController也会调用该方法。此外,它只在用户点击标签栏时被调用,当使用代码以编程方式更改选项卡栏内容时则不会调用此方法。

    通知代理用户在标签栏中(UITabBar)选择了一个标签项(UITabBarItem)。在iOS v3.0及以后版本中,无论所选的视图控制器是否改变,标签栏控制器会调用这个方法。此外,它只在用户点击标签栏(UITabBar)的标签项(UITabBarItem)时被调用,当使用代码以编程方式更改标签栏(UITabBar)的标签项(UITabBarItem)时则不会调用此方法。

    参数 :

    tabBarController : 包含viewController的标签栏控制器。

    viewController:用户选择的视图控制器。在iOS v3.0及更高版本中,这可能是已选中的视图控制器。

    - (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray<__kindof UIViewController *> *)viewControllers API_AVAILABLE(ios(3.0)) API_UNAVAILABLE(tvOS);
    

    函数描述 :通知代理将要显示UITabBarCustomizeView(即点击More(更多)标签项后,在UIMoreListController更多标签项列表控制器中点击编辑按钮时)。

    参数 :

    tabBarController : 正在进行自定义的标签栏控制器。

    viewControllers : 标签栏界面显示的根视图控制器数组,通常(只是通常)包含添加的所有可自定义的标签项(UITabBarItem)对应视图控制器,但不包括一些标准控制器,例如More(更多)标签项对应的控制器。

    即将要显示下面这个页面前调用 :

    截屏2022-04-29 15.33.24.png
    - (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray<__kindof UIViewController *> *)viewControllers changed:(BOOL)changed API_AVAILABLE(ios(3.0)) API_UNAVAILABLE(tvOS);
    

    函数描述 :通知代理将要关闭UITabBarCustomizeView(即在UITabBarCustomizeView点击Done后调用)。

    参数 :

    tabBarController : 正在进行自定义的标签栏控制器。

    viewControllers : 重新排列顺序后的标签栏界面显示的根视图控制器数组。

    changed : 一个布尔值,指示标签栏(UITabBar)上的标签项(UITabBarItem)是否已更改。如果标签项(UITabBarItem)发生变化,则为YES;如果标签项(UITabBarItem)未发生变化,则为NO。

    - (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray<__kindof UIViewController *> *)viewControllers changed:(BOOL)changed API_UNAVAILABLE(tvOS);
    

    函数描述 :通知代理UITabBarCustomizeView已经关闭。

    参数 :

    tabBarController : 正在进行自定义的标签栏控制器。

    viewControllers : 重新排列顺序后的标签栏界面显示的根视图控制器数组。

    changed : 一个布尔值,指示标签栏(UITabBar)上的标签项(UITabBarItem)是否已更改。如果标签项(UITabBarItem)发生变化,则为YES;如果标签项(UITabBarItem)未发生变化,则为NO。

    - (UIInterfaceOrientationMask)tabBarControllerSupportedInterfaceOrientations:(UITabBarController *)tabBarController API_AVAILABLE(ios(7.0)) API_UNAVAILABLE(tvOS);
    

    函数描述 :询问代理为UITabBarController提供支持的界面方向。

    参数 :

    tabBarController : 向代理询问所支持界面方向的UITabBarController。

    返回值 : UIInterfaceOrientationMask界面方面枚举。

    UIInterfaceOrientationMask界面方面枚举值 :

    typedef NS_OPTIONS(NSUInteger, UIInterfaceOrientationMask) {
        //竖屏界面,但 Home(主页)按钮在底部
        UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait),
        //横屏界面,但Home(主页)按钮在左侧
        UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft),
        //横屏界面,但Home(主页)按钮在右侧
        UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight),
        //竖屏界面,但 Home(主页)按钮在顶部
        UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown),
        //横屏界面,Home(主页)按钮在左侧或右侧
        UIInterfaceOrientationMaskLandscape = (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
        //同时支持竖屏与横屏
        UIInterfaceOrientationMaskAll = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown),
        //除了Home(主页)按钮在顶部的竖屏界面,支持其它方向的界面
        UIInterfaceOrientationMaskAllButUpsideDown = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
    } API_UNAVAILABLE(tvOS);
    

    UITabBar -- 标签栏

    UITabBar(标签栏),继承自UIView,可以在其中显示一个或多个按钮的控件,用于在应用程序中的不同子任务、视图或模式之间进行选择。通常,可以将UITabBar(标签栏)与UITabBarController对象结合使用,但也可以将它用作应用程序中的独立控件。UITabBar(标签栏)始终显示在屏幕的下边缘,并显示一个或多个标签项(UITabBarItem)对象的内容。标签栏的外观可以使用背景图像或淡色进行自定义,以满足界面的需要。点击一个标签项(UITabBarItem)选择并高亮显示该项,然后使用该标签项(UITabBarItem)的选择为应用程序启用相应的模式。

    可以通过编程方式或在Interface Builder中配置标签栏。UITabBarController对象提供自己的标签栏对象,使用UITabBarController必须配置提供UITabBar(标签栏)对象。在将UITabBar(标签栏)用作应用程序中的独立控件,并以编程方式创建标签栏时,请使用initWithFrame:方法或其他UIView初始化方法并设置标签项(UITabBarItem)的值来设置其初始配置。使用UITabBar(标签栏)类的方法来配置标签栏的外观。对于用作应用程序中的独立控件的标签栏,还可以使用UITabBar(标签栏)类的方法来指定标签栏显示的标签项(UITabBarItem)。

    UITabBar类和UIToolbar类具有相似的外观,但用途不同。使用标签栏(UITabBar)来传达和更改应用程序的模式。使用工具栏(UIToolbar)向用户呈现与当前显示内容相关的一组操作。

    截屏2022-05-06 09.51.01.png
    UITabBar的常用属性
    @property(nullable, nonatomic, weak) id<UITabBarDelegate> delegate;
    

    属性描述 : 标签栏(UITabBar)的代理对象。使用代理来跟踪标签项(UITabBarItem)的选择,并响应标签栏(UITabBar)的用户自定义。该属性的默认值为nil。

    @property(null_resettable, nonatomic, strong) UIColor *tintColor API_AVAILABLE(ios(5.0));
    

    属性描述 :标签栏(UITabBar)的标签项(UITabBarItem)被选中时使用的文本与图像的填充色。

    @property(nullable, nonatomic, strong) UIImage *selectionIndicatorImage API_AVAILABLE(ios(5.0)) UI_APPEARANCE_SELECTOR;
    

    属性描述 :标签栏(UITabBar)的标签项(UITabBarItem)被选中时,标签项(UITabBarItem)使用的背景图片。

    @property (nonatomic, readwrite, copy) UITabBarAppearance *standardAppearance UI_APPEARANCE_SELECTOR API_AVAILABLE(ios(13.0), tvos(13.0));
    

    属性描述 :在iOS 13.0及以后的版本中,使用该属性获取UITabBarAppearance对象,通过UITabBarAppearance对象配置标签栏(UITabBar)样式。

    接下来的属性在iOS 13.0以前的版本中或标签栏(UITabBar)作为应用程序中的独立控件时,配置标签栏(UITabBar)样式可以使用:

    @property(nullable, nonatomic, copy) NSArray<UITabBarItem *> *items;  
    

    属性描述 : 标签栏显示的标签项(UITabBarItem)。这个属性包含一个标签项(UITabBarItem)对象数组,每个对象对应一个由标签栏(UITabBar)显示的标签项(UITabBarItem)。此属性中标签项(UITabBarItem)的顺序与屏幕上的标签项(UITabBarItem)顺序相对应。可以使用此属性来根据需要访问这些标签项(UITabBarItem)。

    对于用作应用程序中的独立控件而创建的标签栏,可以将一组新的标签项(UITabBarItem)分配给该属性,以更改显示的标签项(UITabBarItem),更改的标签项(UITabBarItem)将立即替换原来标签项(UITabBarItem),这个过程不需要动画。如果标签栏(UITabBar)是由标签栏控制器(UITabBarController)对象管理的,则不能修改这个属性,这样做会引发异常。当标签栏(UITabBar)属于标签栏控制器(UITabBarController)时,使用标签栏控制器(UITabBarController)的方法进行更改。该属性的默认值为nil。

    @property(nullable, nonatomic, weak) UITabBarItem *selectedItem;
    

    属性描述 : 标签栏(UITabBar)上当前选择的标签项(UITabBarItem)。使用此属性可获取当前选定的标签项(UITabBarItem)。如果更改此属性的值,则标签栏(UITabBar)更改相应的标签项(UITabBarItem)选择,并相应地更新标签项(UITabBarItem)的外观。将属性设置为nil以清除标签项(UITabBarItem)的选择。

    当一个标签项(UITabBarItem)被选中时,标签栏(UITabBar)会在标签项(UITabBarItem)的selectedImage属性中为标签项(UITabBarItem)显示图像。如果设置了selectedImageTintColor属性,标签栏(UITabBar)也会将该属性中的颜色应用到标签项(UITabBarItem)selectedImage属性的图像上。为了防止项目的系统着色,使用UIImageRenderingModeAlwaysOriginal渲染模式提供图像。该属性的默认值为nil。

    @property(nullable, nonatomic, strong) UIColor *barTintColor API_AVAILABLE(ios(7.0)) UI_APPEARANCE_SELECTOR;
    

    属性描述 :标签栏(UITabBar)的渲染色,在iOS 13.0以前的版本中,将颜色渲染_UIVisualEffectSubview上,在iOS 13.0及以后的版本中无效。

    @property (nonatomic, readwrite, copy, nullable) UIColor *unselectedItemTintColor API_AVAILABLE(ios(10.0)) UI_APPEARANCE_SELECTOR;
    

    属性描述 :标签栏(UITabBar)中未选中的标签项(UITabBarItem)将使用此颜色着色。将此值设置为nil表示标签栏(UITabBar)应该使用其默认值着色标签项(UITabBarItem)。在iOS 13.0及以后的版本中无效。

    @property(nullable, nonatomic, strong) UIImage *backgroundImage API_AVAILABLE(ios(5.0)) UI_APPEARANCE_SELECTOR;
    

    属性描述 : 标签栏(UITabBar)的自定义背景图像,显示在标签栏(UITabBar)的UIImageView视图上。如果指定了一个可伸缩的背景图像,则标签栏(UITabBar)将拉伸图像以填充可用空间。如果图像不可拉伸且不够大,无法填充可用空间,则标签栏(UITabBar)将平铺图像。UIImage中的UIImageResizingMode类型决定了拉伸效果,当存在自定义背景图像时,标签栏(UITabBar)不会在其后面绘制任何模糊效果,即使半透明属性translucent为YES。在iOS 13.0及以后的版本中若作为独立控件使用有效,否则无效。

    @property(nullable, nonatomic, strong) UIImage *shadowImage API_AVAILABLE(ios(6.0)) UI_APPEARANCE_SELECTOR;
    

    属性描述 : 用于标签栏(UITabBar)的阴影图像。对于具有自定义背景(设置了backgroundImage)的标签栏(UITabBar),可以使用此属性为标签栏(UITabBar)指定自定义的阴影图像。阴影图像位于标签栏(UITabBar)本身的边界之外,通常位于标签栏(UITabBar)的框架矩形上方或下方。具体位置取决于当前的设备平台,例如,在iPhone和iPad上,阴影图像被放置在标签栏(UITabBar)的上方。必须将此属性与自定义背景图像(backgroundImage)结合使用。如果backgroundImage属性为nil,则标签栏(UITabBar)将忽略此属性中的值并使用默认阴影。在iOS 13.0及以后的版本中无效。

    @property(nonatomic,getter=isTranslucent) BOOL translucent API_AVAILABLE(ios(7.0));
    

    属性描述 : 一个布尔值,指示标签栏是否为半透明。如果标签栏(UITabBar)没有自定义背景图像(未设置了backgroundImage),或者自定义背景图像(backgroundImage)的任何像素的alpha值小于1.0,这个属性的默认值是YES。如果自定义背景图像(backgroundImage)是完全不透明的,则此属性的默认值为NO。如果将这个属性设置为YES并且自定义背景图像(backgroundImage)是完全不透明的图像,则会为自定义背景图像(backgroundImage)设置一个alpha小于1.0的值。如果将这个属性设置为NO并且自定义背景图像(backgroundImage)是透明的,UIKit会添加一个不透明的背景(添加到_UIBarBackground)。

    @property(nonatomic) UITabBarItemPositioning itemPositioning API_AVAILABLE(ios(7.0)) UI_APPEARANCE_SELECTOR API_UNAVAILABLE(tvOS);
    

    属性描述:标签栏(UITabBar)中标签项(UITabBarItem)的定位方案。这个属性的默认值UITabBarItemPositioningAutomatic,将根据当前环境导致默认的标签项(UITabBarItem)定位:

    • 在水平紧凑的环境中,标签栏(UITabBar)将标签项(UITabBarItem)分布在整个空间中,并根据需要调整标签项(UITabBarItem)间距。
    • 在水平常规的环境中,标签栏(UITabBar)使用itemWidth和itemSpacing属性设置标签项(UITabBarItem)的宽度和标签项(UITabBarItem)之间的间距,并将这些标签项(UITabBarItem)定位在可用空间的中心。这种配置可能会在标签栏(UITabBar)的左右边缘留出空间。通过将此属性的值更改为不同的值,可以强制执行特定的定位方案。

    水平紧凑与水平常规根据苹果将不同的设备在不同的状态下,根据屏幕的宽高进行决定。

    UITabBarItemPositioning提供的枚举值:

    typedef NS_ENUM(NSInteger, UITabBarItemPositioning) {
        //根据用户界面的习惯用法指定标签栏项的自动定位,默认值。
        UITabBarItemPositioningAutomatic,
        //将标签项(UITabBarItem)分布在标签栏(UITabBar)的整个宽度上。当UITabBarItemPositioningAutomatic选项被选中时,标签栏(UITabBar)在水平紧凑环境中使用这种行为。
        UITabBarItemPositioningFill,
        //在标签栏(UITabBar)可用空间中居中放置标签项(UITabBarItem)。当UITabBarItemPositioningAutomatic选项被选中时,标签栏(UITabBar)在水平常规环境中使用此行为。
        UITabBarItemPositioningCentered,
    } API_AVAILABLE(ios(7.0));
    

    该属性在iOS 13.0及以后的版本中无效。

    @property(nonatomic) CGFloat itemWidth API_AVAILABLE(ios(7.0)) UI_APPEARANCE_SELECTOR;
    

    属性描述:标签栏(UITabBar)的标签项(UITabBarItem)的宽度,在标签栏(UITabBar)标签项(UITabBarItem)的定位方案为居中放置(itemPositioning为UITabBarItemPositioningCentered)时有效,该属性在iOS 13.0及以后的版本中无效。

    @property(nonatomic) CGFloat itemSpacing API_AVAILABLE(ios(7.0)) UI_APPEARANCE_SELECTOR;
    

    属性描述:标签栏(UITabBar)的标签项(UITabBarItem)之间的间距,在标签栏(UITabBar)标签项(UITabBarItem)的定位方案为居中放置(itemPositioning为UITabBarItemPositioningCentered)时有效,该属性在iOS 13.0及以后的版本中无效。

    @property(nonatomic) UIBarStyle barStyle API_AVAILABLE(ios(7.0)) UI_APPEARANCE_SELECTOR API_UNAVAILABLE(tvOS);
    

    属性描述:设置标签栏(UITabBar)的样式。在iOS 13.0及以后的版本中无效。

    UIBarStyle提供的有效的枚举值:

    typedef NS_ENUM(NSInteger, UIBarStyle) {
        //默认样式,通常使用白色背景和黑色内容。
        UIBarStyleDefault          = 0,
        //使用带有浅色内容的黑色背景。
        UIBarStyleBlack            = 1,
    } API_UNAVAILABLE(tvOS);
    
    UITabBar的常用函数
    - (void)setItems:(nullable NSArray<UITabBarItem *> *)items animated:(BOOL)animated; 
    

    函数描述 : 在UITabBarController对象管理的标签栏(UITabBar)上调用此方法会引发异常。在标签栏(UITabBar)用作应用程序中的独立控件时,调用此方法在运行时对当前所有可见的标签项(UITabBarItem)进行更改。

    参数 :

    items : 要显示的标签项(UITabBarItem)对象数组。

    animated : 指示是否应设置更改动画的布尔值。指定YES以设置更改动画,指定NO不设置更改动画。启用动画后,标签栏(UITabBar)会淡出已删除的标签项(UITabBarItem),淡入新的标签项(UITabBarItem),并根据需要调整标签项(UITabBarItem)之间的间距。

    - (void)beginCustomizingItems:(NSArray<UITabBarItem *> *)items API_UNAVAILABLE(tvOS); 
    

    函数描述 :不能使用此方法自定义由选UITabBarController管理的标签栏(UITabBar)。在标签栏(UITabBar)用作应用程序中的独立控件时,调用此函数唤起一个自定义界面(UITabBarCustomizeView),允许用户使用items参数数组中的标签项(UITabBarItem)替换标签栏(UITabBar)现有选项卡栏项。该界面还允许用户重新排列标签栏(UITabBar)上的标签项(UITabBarItem),但不允许用户更改标签栏(UITabBar)上的标签项(UITabBarItem)的总数。该界面包含一个Done(完成)按钮,可自动取消该界面。还可以使用endCustomingAnimated:方法以编程方式关闭界面。

    参数 :

    items:应包括标签栏(UITabBar)中当前可见且允许更改的所有标签项(UITabBarItem)。未包含在此数组中的在当前标签栏(UITabBar)上可见的标签项(UITabBarItem)保持不变,用户无法重新定位或替换。如果用户从标签栏(UITabBar)中删除当前选定的标签项(UITabBarItem),则selectedItem属性将设置为nil。

    - (BOOL)endCustomizingAnimated:(BOOL)animated API_UNAVAILABLE(tvOS);
    

    函数描述 :关闭已经唤起的用于自定义标签栏(UITabBar)的界面,很少需要调用这个方法。通常,用户通过点击界面中内置的Done(完成)按钮来取消界面。但是,如果由于界面的其他部分发生了更改,可能会调用此方法来取消自定义的过程。

    参数 :

    animated : 如果为YES,将设置自定义界面取消的动画。

    返回值 : 如果标签栏(UITabBar)上的标签项(UITabBarItem)发生更改,则为YES;如果没有更改,则为NO。

    UITabBar提供的常用代理函数
    - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;
    

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

    参数 :

    tabBar : 标签栏

    item : 被选中的标签栏项

    - (void)tabBar:(UITabBar *)tabBar willBeginCustomizingItems:(NSArray<UITabBarItem *> *)items API_UNAVAILABLE(tvOS);
    

    函数描述 :通知代理将要显示UITabBarCustomizeView(即点击More(更多)标签项后,在UIMoreListController更多标签项列表控制器中点击编辑按钮时)。

    参数 :

    items:当前在标签栏(UITabBar)显示的所有标签项(UITabBarItem),包括More(更多)标签项。

    - (void)tabBar:(UITabBar *)tabBar didBeginCustomizingItems:(NSArray<UITabBarItem *> *)items API_UNAVAILABLE(tvOS);
    

    函数描述 :通知代理已经显示UITabBarCustomizeView(即点击More(更多)标签项后,在UIMoreListController更多标签项列表控制器中点击编辑按钮时)。

    参数 :

    items:当前在标签栏(UITabBar)显示的所有标签项(UITabBarItem),包括More(更多)标签项。

    - (void)tabBar:(UITabBar *)tabBar willEndCustomizingItems:(NSArray<UITabBarItem *> *)items changed:(BOOL)changed API_UNAVAILABLE(tvOS);
    

    函数描述 :通知代理将要关闭UITabBarCustomizeView(即在UITabBarCustomizeView点击Done后调用)。

    参数 :

    items : 编辑后的标签项(UITabBarItem)数组。

    changed : 一个布尔值,指示标签栏(UITabBar)上的标签项(UITabBarItem)是否已更改。如果标签项(UITabBarItem)发生变化,则为YES;如果标签项(UITabBarItem)未发生变化,则为NO。

    - (void)tabBar:(UITabBar *)tabBar didEndCustomizingItems:(NSArray<UITabBarItem *> *)items changed:(BOOL)changed API_UNAVAILABLE(tvOS);
    

    函数描述 :通知代理已经关闭UITabBarCustomizeView(即在UITabBarCustomizeView点击Done后调用)。

    参数 :

    items : 编辑后的标签项(UITabBarItem)数组。

    changed : 一个布尔值,指示标签栏(UITabBar)上的标签项(UITabBarItem)是否已更改。如果标签项(UITabBarItem)发生变化,则为YES;如果标签项(UITabBarItem)未发生变化,则为NO。

    通常在iOS 13.0及以后的版本中,配置标签栏(UITabBar)外观的相关对象

    UIBarAppearance -- 用于自定义系统栏基本外观的对象

    UIBarAppearance对象包含导航栏(UINavigationBar)、标签栏(UITabBar)和工具栏(UIToolbar)共享的共同特征。配置特定类型的系统栏视图时,通常会实例化相应的系统栏视图外观子类。但是,也可以创建UIBarAppearance对象,配置其属性,并使用它在应用程序中创建新的系统栏视图外观对象。

    UIBarAppearance的常用属性
    @property (nonatomic, readwrite, copy, nullable) UIBlurEffect *backgroundEffect;
    

    属性描述 :要应用于系统栏视图背景的模糊效果。模糊效果为系统栏视图的外观提供了基础层,并决定了底层内容的可见程度。UIKit将背景颜色和背景图像应用于此效果之上。设置为nil则没有模糊效果。

    浅色模糊:

    appearance.backgroundEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
    
    截屏2022-05-12 10.41.31.png

    深色模糊:

    appearance.backgroundEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
    
    截屏2022-05-12 10.46.20.png

    没有模糊:

    appearance.backgroundEffect = nil;
    
    截屏2022-05-12 10.48.12.png

    默认模糊:

    截屏2022-05-12 10.52.02.png
    @property (nonatomic, readwrite, strong, nullable) UIImage *backgroundImage;
    

    属性描述:要应用于系统栏视图的背景图片,背景图片(UIImageView)层显示在backgroundEffect之上,UIKit根据backgroundImageContentMode属性中的值调整图像大小。

    @property (nonatomic, readwrite, assign) UIViewContentMode backgroundImageContentMode;
    

    属性描述:要应用于系统栏视图的背景图片渲染模式,默认为UIViewContentModeScaleToFill。

    @property (nonatomic, readwrite, copy, nullable) UIColor *backgroundColor;
    

    属性描述:要应用于系统栏视图的背景图片(UIImageView)的背景颜色。

    @property (nonatomic, readwrite, strong, nullable) UIImage *shadowImage;
    

    属性描述:要应用于系统栏视图的阴影图片,UIKit使用这个属性和shadowColor属性来确定阴影的外观。当此属性为nil时,根据shadowColor属性的值,显示一个默认的条形阴影;如果shadowColor为nil或clearColor(透明颜色),则系统栏无条形阴影。如果为此属性设置一个模版图片(UIImage的渲染模式(UIImageRenderingMode)为UIImageRenderingModeAlwaysTemplate),则系统栏视图使用该图片作为阴影,并使用shadowColor中的值对图片进行着色,如果shadowColor为nil或包含clearColor(透明颜色),由于图片没有颜色,则系统栏无条形阴影。如果为此属性设置的图片不是模版图片(UIImage的渲染模式(UIImageRenderingMode)为其它),则系统栏视图使用该图片作为阴影,不对图片颜色进行处理。

    @property (nonatomic, readwrite, copy, nullable) UIColor *shadowColor;
    

    属性描述:要应用于系统栏视图的自定义阴影图片颜色或默认阴影的颜色。这取决于阴影图片(shadowImage)是否有值,以及图片的渲染模式。

    UITabBarAppearance -- 用于自定义标签栏外观的对象

    在iOS 13.0及以后的版本中,使用此类的方法和属性指定标签栏(UITabBar)中标签项(UITabBarItem)的外观。使用从UIBarAppearance继承的属性来配置标签栏(UITabBar)本身的背景和阴影属性。

    UITabBarAppearance的常用属性
    /// 具有堆叠布局的标签项(UITabBarItem)的外观属性
    @property (nonatomic, readwrite, copy) UITabBarItemAppearance *stackedLayoutAppearance;
    
    /// 具有直线布局的标签项(UITabBarItem)的外观属性
    @property (nonatomic, readwrite, copy) UITabBarItemAppearance *inlineLayoutAppearance;
    
    /// 在屏幕宽为紧凑环境中具有直线布局的标签项(UITabBarItem)的外观属性
    @property (nonatomic, readwrite, copy) UITabBarItemAppearance *compactInlineLayoutAppearance;
    
    

    属性描述 :用于区分标签项(UITabBarItem)不同布局方式的属性,可以根据布局方式分别设置标签项(UITabBarItem)。

    以下面代码为例,在iPhone8中,竖屏下选中一个标签项(UITabBarItem),标签项(UITabBarItem)图标为红色,横屏下选中一个标签项(UITabBarItem),标签项(UITabBarItem)图标为蓝色。在iPhone8 Plus中,竖屏下选中一个标签项(UITabBarItem),标签项(UITabBarItem)图标为红色,横屏下选中一个标签项(UITabBarItem),标签项(UITabBarItem)图标为绿色。

    if (@available(iOS 13.0, *)) {
            UITabBarAppearance *appearance = self.tabBar.standardAppearance;
            
            UITabBarItemStateAppearance *stackedItem = appearance.stackedLayoutAppearance.selected;
            stackedItem.iconColor = [UIColor redColor];
            
            UITabBarItemStateAppearance *inlineItem = appearance.inlineLayoutAppearance.selected;
            inlineItem.iconColor = [UIColor greenColor];
            
            UITabBarItemStateAppearance *compactInlineItem = appearance.compactInlineLayoutAppearance.selected;
            compactInlineItem.iconColor = [UIColor blueColor];
            
            self.tabBar.standardAppearance = appearance;
            
            if (@available(iOS 15.0, *)) {
                self.tabBar.scrollEdgeAppearance = appearance;
            }
        }
    

    iPhone8为竖屏时,为stackedLayoutAppearance设置的样式:

    截屏2022-05-09 16.17.08.png

    iPhone8为横屏时,为compactInlineLayoutAppearance设置的样式,因为iPhone8为横屏时,苹果将屏幕分类为宽度是紧凑的

    截屏2022-05-09 16.17.58.png

    iPhone8 Plus为竖屏时,为stackedLayoutAppearance设置的样式:

    截屏2022-05-09 16.19.25.png

    iPhone8 Plus为横屏时,为inlineLayoutAppearance设置的样式,因为iPhone8 Plus为横屏时,苹果将屏幕分类为宽度是常规的

    截屏2022-05-09 16.19.37.png
    @property (nonatomic, readwrite, assign) UITabBarItemPositioning stackedItemPositioning;
    

    属性描述 :在标签栏(UITabBar)中具有堆叠布局的标签项(UITabBarItem)使用的定位方案。

    @property (nonatomic, readwrite, assign) CGFloat stackedItemWidth;
    

    属性描述 :具有堆叠布局的标签项(UITabBarItem)的宽度,当标签栏(UITabBar)中具有堆叠布局的标签项(UITabBarItem)使用居中定位(stackedItemPositioning属性设置为UITabBarItemPositioningCentered)时,使用此属性设置每个标签项(UITabBarItem)的宽度。此属性默认值为0,使用系统定义的宽度,当值大于0时,使用指定的宽度,当值小于0时,UIKit将值修正为0。

    @property (nonatomic, readwrite, assign) CGFloat stackedItemSpacing;
    

    属性描述 :具有堆叠布局的标签项(UITabBarItem)之间的间距,当标签栏(UITabBar)中具有堆叠布局的标签项(UITabBarItem)使用居中定位(stackedItemPositioning属性设置为UITabBarItemPositioningCentered)时,使用此属性设置每个标签项(UITabBarItem)之间的间距。此属性默认值为0,使用系统定义的间距,当值大于0时,使用指定的间距,当值小于0时,UIKit将值修正为0。

    UITabBarItemAppearance -- 用于自定义标签项外观的对象

    使用UITabBarItemAppearance对象自定义标签项(UITabBarItem)在其每一个可能状态下的外观。可以为每一个状态自定义不同的外观。例如,在正常和选定状态下,可以对标签项(UITabBarItem)的图标应用不同的颜色。

    UITabBarItemAppearance的常用属性
    @property (nonatomic, readonly, strong) UITabBarItemStateAppearance *normal;
    

    属性描述 :获取处于正常状态(处于启用状态但未选中状态且不是焦点)下标签项(UITabBarItem)外观数据对象。

    @property (nonatomic, readonly, strong) UITabBarItemStateAppearance *selected;
    

    属性描述 :获取处于选中状态下标签项(UITabBarItem)外观数据对象。

    @property (nonatomic, readonly, strong) UITabBarItemStateAppearance *disabled;
    

    属性描述 :获取处于未启用(禁用)状态下标签项(UITabBarItem)外观数据对象。

    @property (nonatomic, readonly, strong) UITabBarItemStateAppearance *focused;
    

    属性描述 :获取处于聚焦状态下标签项(UITabBarItem)外观数据对象。

    UITabBarItemAppearance的常用函数
    /// 使用堆叠布局的默认值构建外观。
    - (instancetype)init;
    
    /// 使用给定布局的默认值构建外观。
    - (instancetype)initWithStyle:(UITabBarItemAppearanceStyle)style NS_DESIGNATED_INITIALIZER;
    
    - (instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
    
    - (instancetype)copy;
    
    /// 将观重置到给定布局。
    - (void)configureWithDefaultForStyle:(UITabBarItemAppearanceStyle)style;
    

    UITabBarItemAppearanceStyle提供的枚举:

    typedef NS_ENUM(NSInteger, UITabBarItemAppearanceStyle) {
        //堆叠布局样式
        UITabBarItemAppearanceStyleStacked,
        //直线布局样式
        UITabBarItemAppearanceStyleInline,
        //紧凑直线布局样式
        UITabBarItemAppearanceStyleCompactInline,
    };
    

    UITabBarItemStateAppearance -- 包含特定状态下自定义的标签项的数据对象

    不要自己创建UITabBarItemStateAppearance对象,通过UITabBarAppearance对象的属性获取处于特定状态的标签项的外观属性(UITabBarItemStateAppearance),然后使用UITabBarItemStateAppearance对象自定义标签项(UITabBarItem)及其标签项(UITabBarItem)显示的徽章的外观。例如,要为处于正常状态的标签项(UITabBarItem)设置属性,通过appearance.stackedLayoutAppearance.normal来获取并设置。

    UITabBarItemStateAppearance常用属性
    @property (nonatomic, readwrite, copy) NSDictionary<NSAttributedStringKey, id> *titleTextAttributes;
    

    属性描述 :要应用于标签项(UITabBarItem)标题文本的字符串属性。

    @property (nonatomic, readwrite, assign) UIOffset titlePositionAdjustment;
    

    属性描述 :要应用于标签项(UITabBarItem)标题文本的水平和垂直偏移量,使用UIOffsetMake设置,正值将标题向下和向右移动。负值会将标题向上向左移动。

    @property (nonatomic, readwrite, copy, nullable) UIColor *iconColor;
    

    属性描述 :用于标签项(UITabBarItem)图标的颜色。

    @property (nonatomic, readwrite, assign) UIOffset badgePositionAdjustment;
    

    属性描述 :要应用于标签项(UITabBarItem)徽章的水平和垂直偏移量,使用UIOffsetMake设置,正值将标题向下和向右移动。负值会将标题向上向左移动。

    截屏2022-05-13 15.49.08.png
    @property (nonatomic, readwrite, copy, nullable) UIColor *badgeBackgroundColor;
    

    属性描述 :用于标签项(UITabBarItem)徽章的背景颜色。

    @property (nonatomic, readwrite, copy) NSDictionary<NSAttributedStringKey, id> *badgeTextAttributes;
    

    属性描述 :应用于标签项(UITabBarItem)徽章文本的字符串属性。

    @property (nonatomic, readwrite, assign) UIOffset badgeTitlePositionAdjustment;
    

    属性描述 :要应用于标签项(UITabBarItem)徽章的文本的水平和垂直偏移量,使用UIOffsetMake设置,正值将标题向下和向右移动。负值会将标题向上向左移动。

    UIBarItem -- 标签栏的某一项(抽象超类)

    派生自NSObject,一个抽象超类,可以用于添加到显示在系统栏视图上的项目控件。每一个项目控件的行为类似于按钮(UIButton的实例)。它们有标题、图像、动作和目标。还可以在系统栏视图上启用和禁用一个项目控件。

    UIBarItem的常用属性
    @property(nonatomic,getter=isEnabled) BOOL         enabled; 
    

    属性描述 : 一个布尔值,指示系统栏视图上的该项目控件是否启用。如果为“NO”,则该项控件将被绘制成部分浅色,以表明它已被禁用。默认值为“YES”。

    @property(nullable, nonatomic,copy)             NSString    *title; 
    

    属性描述 : 项目控件上显示的标题。应该在将项目控件添加到工具栏之前设置此属性。默认值为nil。

    @property(nullable, nonatomic,strong)           UIImage     *image;
    

    属性描述 : 项目控件上显示的图像。该图像可用于创建该项目控件的其他图像——例如,一个选中的和未选中的图像可能会从该图像派生出来。在将项目控件添加到工具栏之前,应设置此属性。默认值为nil。

    @property(nullable, nonatomic,strong)           UIImage     *landscapeImagePhone API_AVAILABLE(ios(5.0)) API_UNAVAILABLE(tvOS);
    

    属性描述 :在iPhone设备上,横屏时项目控件上显示的图像。

    @property(nonatomic)                  UIEdgeInsets imageInsets; 
    

    属性描述 : 项目控件上显示的图像在每个边缘开始插入的位置(即内间距)。默认值为UIEdgeInsetsZero。

    例如设置某一项控件的图片内间距:

    //获取标签栏中的某一项
     UITabBarItem *tabBarItemCart = self.tabBar.items[0];
    //设置该标签项的图片内间距
    tabBarItemCart.imageInsets = UIEdgeInsetsMake(- 20, 0, 20, 0);
    
    截屏2021-05-31下午3.12.59.png
    @property(nonatomic)                  UIEdgeInsets landscapeImagePhoneInsets API_AVAILABLE(ios(5.0)) API_UNAVAILABLE(tvOS);
    

    属性描述 :在iPhone设备上,横屏时项目控件上显示的图像在每个边缘开始插入的位置(即内间距)。默认值为UIEdgeInsetsZero。

    @property(nonatomic)                  NSInteger    tag; 
    

    属性描述 :为系统栏视图上的项目控件提供一个整数标识,默认值为0。

    UIBarItem的常用函数
    //初始化函数
    - (instancetype)init NS_DESIGNATED_INITIALIZER;
    - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
    
    - (void)setTitleTextAttributes:(nullable NSDictionary<NSAttributedStringKey,id> *)attributes forState:(UIControlState)state API_AVAILABLE(ios(5.0)) UI_APPEARANCE_SELECTOR;
    

    函数描述 :为系统栏视图上的项目控件的指定状态设置标题的文本属性。

    参数 :

    attributes : 包含文本属性的键值对的字典。

    state : 要为其设置标题文本属性的项目控件状态。

    - (nullable NSDictionary<NSAttributedStringKey,id> *)titleTextAttributesForState:(UIControlState)state API_AVAILABLE(ios(5.0)) UI_APPEARANCE_SELECTOR;
    

    函数描述 :返回项目控件给定状态下的标题文本属性字典。字典可能包含字体、文本颜色、文本阴影颜色和文本阴影偏移量的文本属性的键值对。

    参数 :

    state : 要获取其标题的文本属性的项目控件状态。

    返回值 : 项目控件给定状态下的标题文本属性字典。

    UITabBarItem -- 标签栏的某一项

    派生自UIBarItem,标签栏(UITabBar)中的一个标签项。标签栏(UITabBar)严格的以单选模式运行,每次选中一个标签项(UITabBarItem),点击标签栏(UITabBar)上的标签项(UITabBarItem)将切换标签栏(UITabBar)上方的视图。也可以在标签项(UITabBarItem)上指定一个标记值来添加额外的视觉信息。例如,Messages应用程序在项目上使用一个标记值来显示新消息的数量。这个类还为创建标签项(UITabBarItem)提供了许多系统默认值。

    UITabBarItem的常用属性
    @property(nullable, nonatomic,strong) UIImage *selectedImage API_AVAILABLE(ios(7.0));
    

    属性描述 :标签项(UITabBarItem)被选中时显示的图像。如果为nil,则超类UIBarItem上的image属性的值将同时用作未选定图像和选定图像。默认情况下,实际选定的图像是根据源图像中的alpha值自动创建的。要防止系统着色,请为图像提供UIImageRenderingModeAlwaysOriginal。

    @property(nullable, nonatomic, copy) NSString *badgeValue;
    

    属性描述 : 显示在标签项(UITabBarItem)右上角并带有周围红色椭圆形的文本(徽章文本)。默认值为nil。

    @property (nonatomic, readwrite, copy, nullable) UIColor *badgeColor API_AVAILABLE(ios(10.0)) UI_APPEARANCE_SELECTOR;
    

    属性描述 : 显示在标签项(UITabBarItem)右上角的文本的周围椭圆形的背景色(徽章背景色),如果未为该属性指定值,则默认使用红色背景颜色。

    标记值文本的样式:

    截屏2020-12-30下午10.17.19.png
    @property (nonatomic, readwrite, assign) UIOffset titlePositionAdjustment API_AVAILABLE(ios(5.0)) UI_APPEARANCE_SELECTOR;
    

    属性描述 : 标签项(UITabBarItem)标题位置的偏移量,使用UIOffsetMake设置,正值将标题向下和向右移动。负值会将标题向上向左移动。

    @property (nonatomic, readwrite, copy, nullable) UITabBarAppearance *standardAppearance UI_APPEARANCE_SELECTOR API_AVAILABLE(ios(13.0), tvos(13.0));
    

    属性描述 :标签栏(UITabBar)作为独立控件的情况下,当显示选中的标签项(UITabBarItem)时,该属性中的外观设置将覆盖UITabBar的standardAppearance属性中的设置。

    @property (nonatomic, readwrite, copy, nullable) UITabBarAppearance *scrollEdgeAppearance UI_APPEARANCE_SELECTOR API_AVAILABLE(ios(15.0));
    

    属性描述 :标签栏(UITabBar)作为独立控件的情况下,当可滚动内容的边缘与标签栏(UITabBar)边缘对齐时,标签栏(UITabBar)的外观设置。

    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
    UITabBarItem的常用函数
    //初始化函数
    - (instancetype)init NS_DESIGNATED_INITIALIZER;
    //初始化函数
    - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
    //使用一个标题、一个图片、一个标识初始化标签项的函数
    - (instancetype)initWithTitle:(nullable NSString *)title image:(nullable UIImage *)image tag:(NSInteger)tag;
    //使用一个标题、一个未选中时的图片、一个选中的图片初始化标签项的函数
    - (instancetype)initWithTitle:(nullable NSString *)title image:(nullable UIImage *)image selectedImage:(nullable UIImage *)selectedImage API_AVAILABLE(ios(7.0));
    //使用系统配置的标签项样式、一个标识初始化标签项的函数
    - (instancetype)initWithTabBarSystemItem:(UITabBarSystemItem)systemItem tag:(NSInteger)tag;
    
    - (void)setBadgeTextAttributes:(nullable NSDictionary<NSAttributedStringKey,id> *)textAttributes forState:(UIControlState)state API_AVAILABLE(ios(10.0)) UI_APPEARANCE_SELECTOR;
    

    函数描述:标签项(UITabBarItem)椭圆形的文本(徽章文本)在指定状态的文本属性。此函数再IOS 13.0以前有效。

    参数 :

    textAttributes : 文本属性的字典。

    state : 标签项的状态。

    - (nullable NSDictionary<NSAttributedStringKey,id> *)badgeTextAttributesForState:(UIControlState)state API_AVAILABLE(ios(10.0)) UI_APPEARANCE_SELECTOR;
    

    函数描述:返回标签项(UITabBarItem)椭圆形的文本(徽章文本)在指定状态的文本属性字典。

    参数 :

    state :标签项的状态。

    返回值 : 标签项(UITabBarItem)椭圆形的文本(徽章文本)在指定状态的文本属性字典。

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

    常用属性
    @property(null_resettable, nonatomic, strong) UITabBarItem *tabBarItem;
    

    属性描述 : 当将视图控制器添加到标签栏控制器时,表示视图控制器的标签栏项。这是UITabBarItem的唯一实例,创建该实例是为了在视图控制器是标签栏控制器的子级时表示它。第一次访问属性时,将创建UITabBarItem。因此,如果不使用标签栏来显示控制器,则不应显示该标签。

    例如:设置标签栏控制器中某一视图控制器的标签项的代码片段:

    //设置标题
    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;
    

    属性描述 : 在层次结构中作为视图控制器的父控制器的最近的标签栏控制器,如果视图控制器或其父控制器之一是标签栏控制器的子级,则此属性包含所属的标签栏控制器。

    相关文章

      网友评论

        本文标题:UITabBarController学习笔记

        本文链接:https://www.haomeiwen.com/subject/otmnurtx.html