自定义UITabBarController,并设为窗口的根控制器
2016-06-27 10:16
197 查看
我们这里不用Main.storyBoard作为程序的主窗口,我们采用代码来自己创建窗口。
下面来到AppDelegate.m,#import "TabBarController.h"(这是我们自定义的UITabBarController,继承自UITabBarController)
在程序启动方法里创建窗口,并设置窗口的根控制器为我们自定义的TabBarController
2.在自定义的UITabBarController里,设置UITabBarItem的文字属性,添加tabBarController的子控制器,替换tabBar为自定义的tabBar
下面来到AppDelegate.m,#import "TabBarController.h"(这是我们自定义的UITabBarController,继承自UITabBarController)
在程序启动方法里创建窗口,并设置窗口的根控制器为我们自定义的TabBarController
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 创建窗口 self.window = [[UIWindow alloc] init]; self.window.frame = [UIScreen mainScreen].bounds; // 设置窗口的根控制器 self.window.rootViewController = [[TabBarController alloc] init];; // 显示窗口 [self.window makeKeyAndVisible]; return YES; }
2.在自定义的UITabBarController里,设置UITabBarItem的文字属性,添加tabBarController的子控制器,替换tabBar为自定义的tabBar
// // TabBarController.m #import "TabBarController.h" #import "TabBar.h" #import "EssenceViewController.h" #import "NewViewController.h" #import "FriendTrendsViewController.h" #import "MeViewController.h" @interface TabBarController () @end @implementation TabBarController - (void)viewDidLoad { [super viewDidLoad]; // 通过appearance统一设置UITabBarItem的文字属性 NSMutableDictionary *attrs = [NSMutableDictionary dictionary]; attrs[NSFontAttributeName] = [UIFont systemFontOfSize:12]; attrs[NSForegroundColorAttributeName] = [UIColor grayColor]; NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary]; selectedAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:12]; selectedAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor]; // 拿到UITabBarItem的appearance UITabBarItem *item = [UITabBarItem appearance]; [item setTitleTextAttributes:attrs forState:UIControlStateNormal]; [item setTitleTextAttributes:selectedAttrs forState:UIControlStateSelected]; // 给tabBarController添加子控制器 [self setupChildVc:[[EssenceViewController alloc] init] title:@"精华" image:@"tabBar_essence_icon" selectedImage:@"tabBar_essence_click_icon"]; [self setupChildVc:[[NewViewController alloc] init] title:@"新帖" image:@"tabBar_new_icon" selectedImage:@"tabBar_new_click_icon"]; [self setupChildVc:[[FriendTrendsViewController alloc] init] title:@"关注" image:@"tabBar_friendTrends_icon" selectedImage:@"tabBar_friendTrends_click_icon"]; [self setupChildVc:[[MeViewController alloc] init] title:@"我" image:@"tabBar_me_icon" selectedImage:@"tabBar_me_click_icon"]; // 更换为自定义的tabBar // self.tabBar = [[TabBar alloc] init]; //tabBar为只读属性,所以我们下面采用KVC的方式 [self setValue:[[TabBar alloc] init] forKey:@"tabBar"]; } /** * 初始化子控制器 */ - (void)setupChildVc:(UIViewController *)vc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage { // 设置文字和图片 vc.tabBarItem.title = title; vc.tabBarItem.image = [UIImage imageNamed:image]; vc.tabBarItem.selectedImage = [UIImage imageNamed:selectedImage]; vc.view.backgroundColor = [UIColor colorWithRed:arc4random_uniform(100)/100.0 green:arc4random_uniform(100)/100.0 blue:arc4random_uniform(100)/100.0 alpha:1.0]; // 添加为子控制器 [self addChildViewController:vc]; } @end3.在自定义的UITabBar里,我们要创建一个特殊的按钮,然后要调整tabBar上所有UITabBarButton的布局
#import "TabBar.h" @interface TabBar() /** 发布按钮 */ @property(nonatomic,weak)UIButton *publishButton; @end @implementation TabBar - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { UIButton *publishButton = [UIButton buttonWithType:UIButtonTypeCustom]; [publishButton setBackgroundImage:[UIImage imageNamed:@"tabBar_publish_icon"] forState:UIControlStateNormal]; [publishButton setBackgroundImage:[UIImage imageNamed:@"tabBar_publish_click_icon"] forState:UIControlStateHighlighted]; [self addSubview:publishButton]; self.publishButton = publishButton; } return self; } - (void)layoutSubviews { [super layoutSubviews]; // 设置 发布按钮 的frame self.publishButton.bounds = CGRectMake(0, 0, self.publishButton.currentBackgroundImage.size.width, self.publishButton.currentBackgroundImage.size.height); self.publishButton.center = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.5); // 设置其他UITabBarButton的frame CGFloat buttonY = 0; CGFloat buttonW = self.frame.size.width / 5; CGFloat buttonH = self.frame.size.height; NSInteger index = 0; for (UIView *button in self.subviews) { // 排除发布按钮 // if(![button isKindOfClass:NSClassFromString(@"UITabBarButton")]) continue; if(![button isKindOfClass:[UIControl class]] || button == self.publishButton) continue; // 计算按钮的x值 CGFloat buttonX = buttonW * ((index>1) ? (index+1) : index); button.frame = CGRectMake(buttonX, buttonY, buttonW, buttonH); // 增加索引 index++; } } @end最后效果:
相关文章推荐
- Masonry的简单使用
- 【Arduino官方教程第零辑】基础部分 2-4 内存
- TreeMap按value值进行排序
- (转载)新手如何正确理解GitHub中“PR(pull request)”中的意思
- iOS中的导航栏UINavigationBar与工具栏UIToolBar要点解析
- 【Arduino官方教程第一辑】示例程序 6-3 Memsic2125加速度计
- 如何在PowerBuilder与DLL之间传递参数
- WWDC-UIKit 中协议与值类型编程实战
- Vue.js——60分钟快速入门
- 全球变暖基础知识小测试程序(Global Warming Facts Quiz)
- 【转】如何在IOS中使用3D UI - CALayer的透视投影
- 【转 iOS 8 Auto Layout界面自动布局系列2-使用Xcode的Interface Builder添加布局约束
- Soap UI 5.2.1 使用手册
- Default Values Table (C# Reference)
- heap with priority queues
- soapui笔记12:PropertyTransfer
- soapui笔记11:Propertis
- UITextField
- Non-Mathematical Feature Engineering techniques for Data Science
- EasyUI模糊查询