iOS-自定义 UITabBarController
2024-10-09 06:56:05
先来回顾一下UITabBarController
( 稍微详细的在在http://blog.csdn.net/yang198907/article/details/49807011)
伴随UITabBarController存在的一个控件叫做导航栏(UITabBar);
UITabBarController中有N个子控制器,那么在UITabBar中就会有N个UITabBarButton作为子控制器;
结构:
控制原理:1对应VC1,2对应VC2.....;
对应的UITabBarItem有相应的属性设置显示的内容,
eg:
标题文字
@property(nonatomic,copy)NSString
*title;
*title;
图标
@property(nonatomic,retain)UIImage
*image;
*image;
选中时的图标
@property(nonatomic,retain)UIImage
*selectedImage;
*selectedImage;
提醒数字
@property(nonatomic,copy)NSString*badgeValue
典型的QQ案例:
什么时候需要自定义UITabBar
当UITabBarItem的默认功能显示不了我们的需求,或者说,我们想更加灵活的使用UITabBarItem的时候;
例如网易彩票:
注意️:文字和房子为一张图片
此时再去使用默认的UITabBarItem的属性设置就会有问题!
自定义UITabBar就派上用场了!
怎么实现自定义UITabBar?
先分析一下UITabBar的功能,点击UITabBarItem则会跳转到对应的控制器;
所以,我们只需要自定义一个UIView或者子类,然后再添加Button,点击Button时再跳转到对应的控制器就就可以了!
废话少说,上点代码:(代码实现了点击底部的button切换控制器)
步骤一:自定义UITabBarController
1)创建YSCTabBarController类继承自UITabBarController
2)创建
YSCTabBar类继承自
UIView,并添加3个Button模拟UITabBarItem;
YSCTabBar类继承自
UIView,并添加3个Button模拟UITabBarItem;
3)创建三个控制器继承自UIViewController
代码1:
#import "YSCTabBarController.h"
#import "YSCTabBar.h"
#import "OneViewController.h"
#import "TwoViewController.h"
#import "ThreeViewController.h"
@interface YSCTabBarController () <YSCTabBarDelegate>
@end
@implementation YSCTabBarController
- (void)viewDidLoad {
[super viewDidLoad];
[self loadViewVC];
YSCTabBar *tabBar = [[YSCTabBar alloc] initWithFrame:self.tabBar.frame WithCount:self.viewControllers.count];
tabBar.delegate = self;
[self.view addSubview:tabBar];
}
- (void)loadViewVC {
OneViewController *oneVC = [[OneViewController alloc] init];
TwoViewController *twoVC = [[TwoViewController alloc] init];
ThreeViewController *threeVC = [[ThreeViewController alloc] init];
self.viewControllers = @[oneVC,twoVC,threeVC];
}
- (void)yscTabbar:(YSCTabBar *)tabar index:(NSInteger)index {
self.selectedIndex = index;
}
@end
代码2:
#import "YSCTabBar.h"
@implementation YSCTabBar
- (instancetype)initWithFrame:(CGRect)frame WithCount:(NSInteger )count {
if (self = [super initWithFrame:frame]) {
CGFloat W = [UIScreen mainScreen].bounds.size.width / count;
CGFloat H = 49;
for (int i = 0; i < count; i ++) {
CGFloat X = i * W;
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(X, 0, W, H)];
btn.tag = i;
btn.backgroundColor = [UIColor colorWithRed:((float)arc4random_uniform(256) / 255.0) green:((float)arc4random_uniform(256) / 255.0) blue:((float)arc4random_uniform(256) / 255.0) alpha:1.0];
[self addSubview:btn];
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
}
}
return self;
}
- (void)btnClick:(UIButton *)btn{
if ([self.delegate respondsToSelector:@selector(yscTabbar:index:)]) {
[self.delegate yscTabbar:self index:btn.tag];
}
}
@end
代码3、
#import "OneViewController.h"
@interface OneViewController ()
@end
@implementation OneViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor redColor];
}
@end
步骤二
代码创建实例化UIWindow并创建
YSCTabBarController:
YSCTabBarController:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
YSCTabBarController *tabVC = [[YSCTabBarController alloc] init];
self.window.rootViewController = tabVC;
[self.window makeKeyAndVisible];
return YES;
}
效果图:
总结:UITabBarController给我们提供了一个非常好的选择哪个控制的属性,否则,我们还需要根据不同的;
eg:
- (void)yscTabbar:(YSCTabBar*)tabar
index:(NSInteger)index {
self.selectedIndex=
index;
index:(NSInteger)index {
self.selectedIndex=
index;
}
此外,子控件让父控件做一些事情的时候,可以通过代理或者block来实现,本demo使用的是代理的方式;
基于此,我们还可以写出创建YSCTabBar类继承自UIScrollView
实现如下效果:
最新文章
- Centos GPG key retrieval failed: [Errno 14] Could not open/read file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL
- C++设计新思维的traits和policy
- SQL SERVER ->;>; BCP导出数据到平面文件
- JAVA中获取项目文件路径
- uva 1422 - Processor(二分+优先队列)
- (原创)(C#随笔)IEnumerable<; ICollection <; IList区别
- FreeRTOS中断优先级配置(重要)
- 2015年ACM-ICPC亚洲区域赛合肥站网络预选赛H题——The Next (位运算)
- SpringMVC源码之Controller查找原理
- tensorFlow(六)应用-基于CNN破解验证码
- 预浸料(Prepreg,PreimpregnatedMaterials)
- SAP CRM 忠诚度相关表的关系图
- 洛谷P2329 栅栏 [SCOI2005] 搜索
- topcoder srm 525 div1
- Activit工作流学习例子
- UI控件Telerik UI for WinForms发布R1 2019|附下载
- MySQL默认INFORMATION_SCHEMA,MySQL,TEST三个数据库用途(转)
- (领悟)第一个servlet
- 从0开始学习 GITHUB 系列之「GIT 进阶」【转】
- Spring源码深度解析系列-----------org.springframework.aop-3.0.6.RELEASE
热门文章
- python实现简易工资管理系统(Salary Manage)源码
- 「雕爷学编程」Arduino动手做(38)——joystick双轴摇杆模块
- 【python深度学习】KS,KL,JS散度 衡量两组数据是否同分布
- Iterator模式C++实现
- Django之from.Form内置字段
- Java基础以及变量和运算符、包机制、javadoc生成
- springboot连接数据源,配置数据库
- Win10下安装Linux子系统-Ubuntu
- 【Gabor】基于多尺度多方向Gabor融合+分块直方图的表情识别
- [SD心灵鸡汤]002.每月一则 - 2015.06