UITabBarController详解

一款iOS可高度自定义的TabBarController 一款可高度自定义的TabBarController,几乎可以自定义所有想自定义的元素。 安装方法: pod 'YPTabBarController'或者,直接将YPTabBarController文件夹拖入工程。 功能介绍: 功能强大的自定义TabBarController,可以自定义:1. 替代系统的UITabBarController,以下属性均可自定义:a) TabBar:位置、大小、边框、圆角、分割线、内容支持滚动等;b) TabItem:图像、选中背景、title字体、title颜色等,均包含选中和未选中两种状态;c) Badge:支持数字badge和小圆点badge,可自定 立即下载

一. UITabBarController简介

(一). 继承关系

UITabBarController和UINavigationController类似,也继承于UIViewController,也可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型的例子就是QQ、微信等应⽤。

(二). 基本概念

父控制器:通过标签控制器管理多个子控制器,标签控制器就称为父控制器

子控制器:添加到标签控制器里的控制器都做为标签控制器的子控制器

标签栏:也叫选项卡栏,方便用户切换到对应的界面,当往标签控制器里添加子控制器,标签栏就会有序的自动生成对应的标签

标签栏按钮:也叫标签,UITabBarButton,这个类只有apple内部开发人员才能使用

二. UITabBarController常见属性和方法

// 以数组的方式设置子控制器
@property(nonatomic,copy) NSArray *viewControllers;
// 以数组的方式设置子控制器
- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated;
// 通过设置选中的子控制器,设置默认显示的子控制器
@property(nonatomic,assign) UIViewController *selectedViewController;
// 通过设置选中的子控制的索引,设置默认显示的子控制器
@property(nonatomic) NSUInteger selectedIndex;
// moreNavigationController是默认创建的,只有子控制器的数量超过5个的时候才显示”More”按钮
@property(nonatomic,readonly) UINavigationController *moreNavigationController;
// 在”More”的控制器视图中,有一个“Edit”按钮,设置这个按钮里面显示的自定义控制器,默认是所有控制器
// 注意:当UITabBarController的viewControllers属性发生变化的时候,customizableViewControllers就会自动设置成跟viewControllers一致
@property(nonatomic,copy) NSArray *customizableViewControllers;
// 只读,标签栏,默认生成
@property(nonatomic,readonly) UITabBar *tabBar
// 代理
@property(nonatomic,assign) id<UITabBarControllerDelegate> delegate;

三. UITabBarController的代理方法

// 是否允许选中控制器viewController
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController;
// 选中控制器时调用
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController;
// 当点击”More”的控制器视图里的“Edit”按钮时调用
- (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers;
// 点击”More”的控制器视图里的“Edit”按钮,在即将退出编辑时调用
- (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed;
// 点击”More”的控制器视图里的“Edit”按钮,在退出编辑后调用
- (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed;

四. UITabBarController的原理

  1. 当UITabBarController做为Window的根控制器时,程序一启动,UITabBarController就会一次性初始化所有子控制器,但是默认只加载第一个控制器视图,其他视图控制器只初始化,但默认不会加载,只有在需要显示的时候才调用loadView方法加载。特殊情况:在AppDelegate中设置其他的子控制器视图的背景颜色,就会提前加载该控制器视图,但不显示该视图。

  2. 每一个控制器视图只加载一次,就会一直存在内存中,当切换子控制器时直接显示,不显示在屏幕上的子控制器不会被销毁。当遇到内存警告时,会释放掉没有加载的子控制器。

  3. 每个视图控制器都有一个tabBarController属性,通过它可以访问所在的UITabBarController,而且对于UITabBarController的直接子视图,其tabBarController属性相当于它的父视图parentViewController。

  4. 每个视图控制器都有一个tabBarItem属性,通过它控制视图在UITabBarController的tabBar中的显示信息

  5. tabBarItem的image属性必须是png格式(建议大小32*32),并且打开alpha通道否则无法正常显示。

  6. 当往UITabBarController添加子控制器,标签栏就会有序的自动生成对应的UITabBarButton对象,有多少个子控制器,标签栏就有多少个UITabBarButton对象,但是子控制器的数量超过5个的时候,标签栏上的第五个UITabBarButton对象就会显示成”More”类型的按钮。

五. UITabBarController的知识点

(一). 关于UITabBarController

  1. UITabBarController没有根控制器的概念。在添加了相同的子控制器,不会增加tabitem的数量。子控器可以是UIViewController、UINavigationController、UITableViewController或者其他的视图控制器

  2. UITabBarButton在UITabBar中的位置是均分的,UITabBar的高度为49,UITabBarButton⾥面显⽰什么内容,由对应子控制器的tabBarItem属性来决定

  3. UITabBarController一般作为应用程序的rootViewController,但是它不能作为UINavigationController的根控制器

  4. UITabBarController默认只支持竖屏,当设备方向放生变化时候,它会查询viewControllers属性中包含的所有ViewController,仅当所有的viewController都支持该方向时,UITabBarController才会发生旋转,否则默认的竖向

(二). 关于UITabBar

1. 简介

UITabBar继承于UIView,方便用户切换到对应的界面,当往标签控制器里添加子控制器,标签栏就会有序的自动生成对应的标签;创建一个标签控制器,就默认创建一个标签栏,标签栏最多显示5个标签

2. 常用属性和方法

// 代理
@property(nonatomic,assign) id<UITabBarDelegate> delegate;
// 设置数据模型,不能给系统默认创建的UITabBar设置items
@property(nonatomic,copy) NSArray *items;
// 设置选中数据模型,不能给系统默认创建的UITabBar设置selectedItem
@property(nonatomic,assign) UITabBarItem *selectedItem;
// iOS7之前,tintColor可以修改背景色
@property(nonatomic,retain) UIColor *tintColor;
// iOS7之后,修改背景色只能用barTintColor
@property(nonatomic,retain) UIColor *barTintColor;
// 设置UITabBar的背景图片
@property(nonatomic,retain) UIImage *backgroundImage
// 设置选中的按钮的背景图片
@property(nonatomic,retain) UIImage *selectionIndicatorImage
// 设置阴影图片,但必须设置backgroundImage属性
@property(nonatomic,retain) UIImage *shadowImage
// 设置数据模型,不能给系统默认创建的UITabBar设置items
- (void)setItems:(NSArray *)items animated:(BOOL)animated;

3. UITabBar的数据模型

UITabBar的每个按钮的内容由对应的子控制的tabBarItem属性决定

----------  UITabBarItem的常用接口

@interface UITabBarItem : UIBarItem

// 设置选中图片
@property(nonatomic,retain) UIImage *selectedImage;
// 设置角标,一般用于提示用户有新消息
@property(nonatomic,copy) NSString *badgeValue;
// 初始化UITabBarItem对象
- (instancetype)initWithTitle:(NSString *)title image:(UIImage *)image tag:(NSInteger)tag;
// 初始化UITabBarItem对象
- (instancetype)initWithTitle:(NSString *)title image:(UIImage *)image selectedImage:(UIImage *)selectedImage;
// 初始化UITabBarItem对象
- (instancetype)initWithTabBarSystemItem:(UITabBarSystemItem)systemItem tag:(NSInteger)tag;

@end

----------  UIBarItem的常用接口

@interface UIBarItem : NSObject

// 是否有效
@property(nonatomic,getter=isEnabled) BOOL enabled;
// 设置标题
@property(nonatomic,copy) NSString *title;
// 设置图片
@property(nonatomic,retain) UIImage *image;
// 设置横向图片
@property(nonatomic,retain) UIImage *landscapeImagePhone; 
// 设置图片边距
@property(nonatomic) UIEdgeInsets imageInsets;
// 设置横向图片边距
@property(nonatomic) UIEdgeInsets landscapeImagePhoneInsets;
// 设置对应的控制器的标签
@property(nonatomic) NSInteger tag;

@end


----------  UITabBarSystemItem的枚举类型

typedef NS_ENUM(NSInteger, UITabBarSystemItem) {
    UITabBarSystemItemMore,
    UITabBarSystemItemFavorites,
    UITabBarSystemItemFeatured,
    UITabBarSystemItemTopRated,
    UITabBarSystemItemRecents,
    UITabBarSystemItemContacts,
    UITabBarSystemItemHistory,
    UITabBarSystemItemBookmarks,
    UITabBarSystemItemSearch,
    UITabBarSystemItemDownloads,
    UITabBarSystemItemMostRecent,
    UITabBarSystemItemMostViewed,
};

4. UITabBar的代理方法

UITabBar的代理方法与UITabBarController的代理方法有些类似

// 选中时调用
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;
// 即将编辑时调用
- (void)tabBar:(UITabBar *)tabBar willBeginCustomizingItems:(NSArray *)items;  
// 编辑时调用                  
- (void)tabBar:(UITabBar *)tabBar didBeginCustomizingItems:(NSArray *)items; 
// 即将结束编辑时调用        
- (void)tabBar:(UITabBar *)tabBar willEndCustomizingItems:(NSArray *)items changed:(BOOL)changed; 
// 结束编辑时调用
- (void)tabBar:(UITabBar *)tabBar didEndCustomizingItems:(NSArray *)items changed:(BOOL)changed;

5. 覆盖UITabBarController自带的tabBar为自定义的tabBar操作原理

tabBar上的按钮是在viewDidAppear的时候拿到 self.tabBar 再调用addSubViews添加上去的,在viewDidAppear之前把控制器的tabBar换成我们自己的tabBar,就会把tabBar上的按钮添加到自己的tabBar上。但是tabBar控制器的tabBar属性是只读的,不能直接赋值,可以利用运行时机制发送消息

六. UITabBarController的简单使用

(一). 使用步骤:

  1. 初始化UITabBarController

  2. 设置UIWindow的rootViewController为UITabBarController

  3. 创建相应的子控制器(viewcontroller)

  4. 把子控制器添加到UITabBarController

(二). 具体代码

1. AppDelegate.m文件

#import "AppDelegate.h"
#import "ViewController.h"
#import "TwoViewController.h"
#import "NavigationController.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  // 创建窗口
  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

  // 创建标签控制器
  UITabBarController *tabBarC = [[UITabBarController alloc] init];

  // 设置窗口的根控制器为标签控制器
  self.window.rootViewController = tabBarC;

  // 显示窗口
  [self.window makeKeyAndVisible];


  // 创建标签控制器的子控制器
  ViewController *vc1 = [[ViewController alloc] init];
  TwoViewController *vc2  =[[TwoViewController alloc] init];
  NavigationController *nav = [[NavigationController alloc] init];

  // 添加子控制器方式一
  //tabBarC.viewControllers = @[vc1,vc2,nav];
  // 添加子控制器方式二
  [tabBarC addChildViewController:vc1];
  [tabBarC addChildViewController:vc2];
  [tabBarC addChildViewController:nav];

  // 设置标签栏的背景图片
  tabBarC.tabBar.backgroundImage = [UIImage imageNamed:@"Snip20160825_2"];


  return YES;
}

@end

2. ViewController.m文件

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (instancetype)init {
  if (self = [super init]) {
    // 设置标题
    self.tabBarItem.title = @"界面1";
    // 设置图片,只有设置图片的渲染模式,才能看到图片
    self.tabBarItem.image = [[UIImage imageNamed:@"Snip20160825_1"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    // 设置角标,如果没有设置图片,角标默认显示在左上角,设置了图片就会在图片的右上角显示
    self.tabBarItem.badgeValue = @"10";

  }
  return self;
}

- (void)viewDidLoad {

  self.view.backgroundColor = [UIColor redColor];

}

@end

3. TwoViewController.m文件

#import "TwoViewController.h"

@interface TwoViewController ()

@end

@implementation TwoViewController

- (instancetype)init {
  if (self = [super init]) {
    // 设置标题
    self.tabBarItem.title = @"界面2";
  }
  return self;
}

- (void)viewDidLoad {

  self.view.backgroundColor = [UIColor greenColor];

}

@end

4. NavigationController.m文件

#import "NavigationController.h"

@interface NavigationController ()

@end

@implementation NavigationController

- (instancetype)init {
  if (self = [super init]) {
    // 设置标题
    self.tabBarItem.title = @"界面3";
    // 设置图片,只有设置图片的渲染模式,才能看到图片
    // 设置角标,如果没有设置图片,角标默认显示在左上角,设置了图片就会在图片的右上角显示
    self.tabBarItem.badgeValue = @"100";

  }
  return self;
}

- (void)viewDidLoad {

  self.view.backgroundColor = [UIColor blueColor];

}

@end
基于STM32的智能垃圾分类机器人 垃圾分类是城市管理的重要环节,传统人工分拣效率低、成本高。本文设计了一款基于STM32的智能垃圾分类机器人,通过视觉识别与机械臂协同作业,实现垃圾自动分类与投放,适用于社区、公共场所等场景,可显著提升垃圾分类效率。:STM32H743(480MHz Cortex-M7,支持AI加速)本系统实现了垃圾分拣的自动化,显著提升了分类效率。OV5640摄像头(500万像素,支持JPEG输出)支持4类垃圾识别(可回收/厨余/有害/其他)问题讨论,stm32的资料领取可以私信!超声波避障(探测距离0.1-4m) 阅读详情

相关推荐

Python 上位机开发

首先,什么是上位机?上位机通常是指可以与下位机(如单片机、传感器等硬件设备)进行通信和交互,实现数据采集、控制指令发送以及数据处理和展示的计算机程序。 Python 作为一种高级编程语言,在开发上位机方面具有诸多优势。它拥有丰富的第三方库,使得开发过程变得相对简单和高效。

weixin_46807151的博客 4302

UITabBarController

1 UITabBarController的常用属性和方法 一般来说,目前市面上的App很多都是由一个UITabBarController管理着4~5个UINavigationController,然后每个UINavigationController又管理着一组UIViewController对象或者其子类对象(如UITableViewController、UICollectionViewController等)。 在UITabBarController类中,有两个核心属性,分别为viewControll

qq_32619837的博客 1218

铭飞MCMS源码部署

文章目录前言一、下载铭飞源码二、部署源码1.使用IDEA打开源码2.配置tomcat环境2.1下载tomcat并测试是否可以成功启动(此处不赘述)2.2在IDEA中安装tomcat环境并配置3.添加数据库,并配置3.1新建数据库3.2 导入sql配置三、启动测试 前言 铭飞MCMS基于IDEA、tomcat和mysql的环境搭建。 提示:以下是本篇文章正文内容,下面案例可供参考 一、下载铭飞源码 gitee:https://gitee.com/mingSoft/MCMS/releases(各种版本按需下

MARS_ZORO的博客 4062

iOS UITabBarController用法原理详解(一)、自定义tabbar

UITabBarController的原理: UITabBarController会一次性初始化所有子控制器,但是默认只加载第一个控制器视图,其他视图控制器只初始化默认不会加载,只有当需要显示的时候才loadView加载,为了能够将其他子控制器也正常显示在Tab bar中,我们访问了每个子视图控制器的视图以便调用其视图加载方法(viewDidLoad);当然,既然会调用子视图的初始化方法,...

代码解释生活 1万+

从查表法到实时计算:SimpleFOC库中正弦函数优化的技术演进

本文深入探讨了SimpleFOC库v2.0.1版本中正弦函数优化技术的演进,从传统查表法到实时计算的创新实践。通过定点数优化、对称性利用和分段线性插值等关键技术,实现了在嵌入式电机控制中的高效三角函数计算,显著提升性能和资源利用率。

weixin_28273593的博客 452

实验手册(灾难恢复)

我们发现DC1与DC2的复制出现问题,此时我们检查了在DC2中,DC1是否被正确注册。这里选择还原系统状态,因为我们原DC1上只备份了AD的数据,所以我们在新的这台服务器上还原的也是AD数据库。因为我们是单域下的测试,只测试了一个域,所以它会出现这样的报错。我们选择远程共享文件夹,我们备份的时候,是在备份这台服务器上的。同时删除SRV记录,A记录,NS记录,SOA记录,框框里面的所有有关dc1的记录全部删除。如果在企业中AD数据的备份是每周或者每月都会有一次备份,选择恢复AD数据库的时间。

weixin_52364868的博客 1309

iOS开发之UI篇(15)—— UITabBarController

版本 Xcode 10.2 iPhone 6s (iOS12.4) 目录版本继承关系简介创建方法属性UITabBarItemUIBarItem 继承关系 UITabBarController : UIViewController : UIResponder : NSObject 简介 A container view controller that manages a radio-style ...

看影成痴 809

从入门到精通:用友BIP旗舰版全模块实施与运维实战指南

本文详细介绍了用友BIP旗舰版的全模块实施与运维实战指南,涵盖财务云、供应链云、生产制造等核心模块的配置与优化技巧。通过渐进式学习法和实战案例,帮助用户从入门到精通,提升系统实施效率和运维能力,特别适合企业IT人员和实施顾问参考。

weixin_29207533的博客 899

UITabBarController使用详解

UITabBarController是IOS中很常用的一个viewController,例如系统的闹钟程序,ipod程序等。UITabBarController通常作为整个程序的rootViewController,而且不能添加到别的container viewController中。   首先我们看一下它的view层级图: 一、手动创建UITabBarController

wsmrcool的专栏 544

基于情感分析+聚类分析+LDA主题分析对服装产品类的消费者评论分析

本研究旨在通过对服装产品类的消费者评论进行综合分析,为企业提供更全面、更深入的市场洞察和决策支持。同时,本研究的方法和结果也可以为其他领域的消费者评论分析提供借鉴和参考。

m0_64336780的博客 2万+

【GameFramework框架内置模块】2、数据节点(Data Node)

这一篇讲数据节点DataNode,基本开发程序都会有类似数据节点作用的东西,数据节点的作用其实就是保存游戏运行时的一些缓存数据,比如用户登录信息、用户名、任务节点等等。数据一般会有增删改查这四种操作,在运行时的数据一般是使用单例或者静态属性,将数据存储在内存中而数据节点也是将数据存储在内存中,但是不用序列化数据,比使用单例或者静态属性要容易维护的多,特别时它的树形结构可以让我们很好的组织我们的数据结构,方便做增删改查操作。数据节点DataNode模块的数据的存储方式是以树形结构存储。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 3181

UITabBarController 详解

// UITabBarController 标签视图控制 // 主要管理没有层级关系的视图控制器 // 1. ViewControllers 所有被管理的视图控制器, 都在这个数组中 // 2. set // 可以通过setter方法去赋值 //也可以通过下述方法进行视图控制器数组赋值 // 3. 通过一个数组创建完成后...

weixin_30692143的博客 98

瑞芯微RK3588/RK3576平台采集BT1120(fpga)驱动调试记录

本文介绍了在RK3576/RK3588平台上采集FPGA传输的BT1120数据的方法。主要内容包括:1)硬件连接需确认管脚复用和图像格式(通常为uyvy_2x8);2)设备树配置要点,如I2C总线设置、BT1120模式指定等;3)驱动适配注意事项,包括时钟极性、分辨率格式等关键参数;4)测试方法,通过media-ctl和v4l2-ctl工具验证数据采集。文中特别指出RK3576和RK3588配置的通用性,并提供了常见问题的排查思路。

bingdund的博客 913
上一篇: UINavgationViewController详解
下一篇: iOS之模态情境
活在生活里
博客等级 码龄11年 94粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值