Objective-C的UITabBarController学习笔记

2,029 阅读34分钟

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

13778663-753240e62eddd780.png

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

13778663-2efafe21f74454d7.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(更多)导航控制器的样式:\color{red}{moreNavigationController对应的More(更多)导航控制器的样式:}

13778663-4dbed58044c92e08.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中的数组元素相同)。

编辑控制器对应的标签项页面:\color{red}{编辑控制器对应的标签项页面 :}

13778663-3731ad65ec3e9393.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。

UITabBarControllerDelegate - 提供的常用代理函数
- (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(更多)标签项对应的控制器。

即将要显示下面这个页面前调用:\color{red}{即将要显示下面这个页面前调用 :}

13778663-b076dab873c93eec.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)来向用户呈现与当前显示内容相关的一组操作

标签栏控件构成:\color{red}{标签栏控件构成 :}

13778663-a9a6d83ffab0e09a.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)外观样式

@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(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 (nonatomic, readwrite, copy, nullable) UITabBarAppearance *scrollEdgeAppearance UI_APPEARANCE_SELECTOR API_AVAILABLE(ios(15.0));

属性描述在iOS 15.0及以后的版本中,当可滚动内容的边缘与标签栏(UITabBar)的边缘对齐时,标签栏(UITabBar)的外观设置。标签栏控制器(UITabBarController)含标签栏(UITabBar)和可滚动视图时,滚动视图的部分内容会出现在标签栏下方,如果滚动内容的边缘到达该栏,UIKit将应用此属性中的外观设置标签栏(UITabBar)。

如果此属性的值为nil,UIKit使用标签栏(UITabBar)的standardAppearance属性的值,并修改为具有透明背景。 如果没有标签栏控制器(UITabBarController)管理标签栏(UITabBar),UIKit 会忽略这个属性并使用标签栏(UITabBar)的标准外观

未设置scrollEdgeAppearance对标签栏的影响:\color{red}{未设置scrollEdgeAppearance对标签栏的影响 :}

13778663-8563fbc20edebb03.png

13778663-eab0d587cf55ffb3.png

在iOS 15.0及以后的版本中,标签栏控制器(UITabBarController)管理标签栏(UITabBar)最好加上该属性,以保证标签栏样式一致

if (@available(iOS 13.0, *)) {
        UITabBarAppearance *appearance = self.tabBar.standardAppearance;
        appearance.backgroundColor = [UIColor redColor];
        self.tabBar.standardAppearance = appearance;
        if (@available(iOS 15.0, *)) {
            self.tabBar.scrollEdgeAppearance = appearance;
        }
    } else {
        self.tabBar.barTintColor = [UIColor redColor];
    }
接下来的属性在iOS 13.0以前的版本中或标签栏(UITabBar)作为应用程序中的独立控件时,配置标签栏(UITabBar)样式可以使用
@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) UITabBarItemPositioning itemPositioning API_AVAILABLE(ios(7.0)) UI_APPEARANCE_SELECTOR API_UNAVAILABLE(tvOS);

属性描述:标签栏(UITabBar)中标签项(UITabBarItem)的定位方案,该属性在iOS 13.0及以后的版本中无效。这个属性的默认值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));
@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。

UITabBarDelegate - 提供的常用代理函数
- (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。

UIBarAppearance -- 用于自定义系统栏基本外观的对象(通常在iOS 13.0及以后的版本中,配置标签栏(UITabBar)外观的相关对象)

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

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

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

浅色模糊:

appearance.backgroundEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];

13778663-8a07823cbf89fde4.png

深色模糊:

appearance.backgroundEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];

13778663-1a60ef2551bd5bdf.png

没有模糊:

appearance.backgroundEffect = nil;

13778663-f77c217045ab222a.png

默认模糊:

13778663-e4d25149b78d91ae.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 -- 用于自定义标签栏外观的对象(继承UIBarAppearance)

在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设置的样式:

13778663-515fec04927e9426.png

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

13778663-998e3ef18cd3caf2.png

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

13778663-60429f5fead9eef9.png

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

13778663-32e09bc50610be5e.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设置,正值将标题向下和向右移动。负值会将标题向上向左移动。

13778663-c272789a49e174a6.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);

13778663-16b034b0cf35721f.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)右上角的文本的周围椭圆形的背景色(徽章背景色),如果未为该属性指定值,则默认使用红色背景颜色。

标记值文本的样式:

13778663-27f8935356008085.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) -- 标签栏控制器项

视图控制器使用此扩展中的属性配置作为UITabBarController子视图时,视图控制器对应的标签项内容。

常用属性
@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;

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