首页 > 代码库 > 自定义UITabBar
自定义UITabBar
以微博为例,自定义TabBar,给初学者参考:
CJTabBar.h
//// CJTabBar.h// 自定义Tabar//// Created by CoderJee on 15/1/25.// Copyright (c) 2015年 CoderJee. All rights reserved.//#import <UIKit/UIKit.h>@protocol CJTabBarDelegate <NSObject>@optional- (void)tabBarCompose;@end@interface CJTabBar : UITabBar@property (nonatomic, weak)id<CJTabBarDelegate> composeDelegate;@end
CJTabBar.m
//// CJTabBar.m// 自定义Tabar//// Created by CoderJee on 15/1/25.// Copyright (c) 2015年 CoderJee. All rights reserved.//#import "CJTabBar.h"#import "UIView+Extension.h"@interface CJTabBar ()@property (nonatomic, weak)UIButton *composeBtn;@end@implementation CJTabBar- (id)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { if (![[UIDevice currentDevice].systemVersion doubleValue]>=7.0) { self.backgroundImage = [UIImage imageNamed:@"tabbar_background"]; } self.selectionIndicatorImage = [UIImage imageNamed:@"navigationbar_button_background"]; [self setUpComposeBtn]; } return self;}/** * 发微博 */- (void)setUpComposeBtn{ // 创建UIButton UIButton *addBtn = [[UIButton alloc] init]; // 设置常态下,和高亮状态下的背景图 [addBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button"] forState:UIControlStateNormal]; [addBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted]; // 设置UIButton的ImageView [addBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add"] forState:UIControlStateNormal]; [addBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_highlighted"] forState:UIControlStateHighlighted]; [addBtn addTarget:self action:@selector(addClick:) forControlEvents:UIControlEventTouchUpInside]; self.composeBtn = addBtn; [self addSubview:addBtn];}- (void)addClick:(UIButton *)addBtn{ if ([self.composeDelegate respondsToSelector:@selector(tabBarCompose)]) { NSLog(@"方法:%s\n文件:%s\n行数:%d",__FUNCTION__,__FILE__,__LINE__); // [self.composeDelegate tabBarCompose]; }}// 设置子控件的frame- (void)layoutSubviews{ [super layoutSubviews]; // 设置size self.composeBtn.size = self.composeBtn.currentBackgroundImage.size; self.composeBtn.centerX = self.width * 0.5; self.composeBtn.centerY = self.height * 0.5; int index = 0; for (UIView *tabarButton in self.subviews) { if ([tabarButton isKindOfClass: NSClassFromString(@"UITabBarButton")]) { CGFloat tabarW = self.width/(self.items.count + 1); CGFloat tabarH = self.height; CGFloat tabarY = 0; if (index >= 2) { tabarButton.frame = CGRectMake((index + 1) * tabarW, tabarY, tabarW, tabarH); }else { tabarButton.frame = CGRectMake(index * tabarW, tabarY, tabarW, tabarH); } index ++; } continue; }}@end
CJTabBarController.h
//// CJTabBarControllerViewController.h// 自定义Tabar//// Created by CoderJee on 15/1/25.// Copyright (c) 2015年 CoderJee. All rights reserved.//#import <UIKit/UIKit.h>@interface CJTabBarController : UITabBarController@end
CJTabBarController.m
//// CJTabBarControllerViewController.m// 自定义Tabar//// Created by CoderJee on 15/1/25.// Copyright (c) 2015年 CoderJee. All rights reserved.//#import "CJTabBarController.h"#import "CJTabBar.h"#import "CJNavigationController.h"@interface CJTabBarController ()<CJTabBarDelegate>@end@implementation CJTabBarController- (void)viewDidLoad { [super viewDidLoad]; UITableViewController *home = [[UITableViewController alloc] init]; [self addoneChildViewController:home title:@"首页" imageName:@"tabbar_home" selectedImageName: @"tabbar_home_selected"]; UITableViewController *message = [[UITableViewController alloc] init]; [self addoneChildViewController:message title:@"消息" imageName:@"tabbar_message_center" selectedImageName:@"tabbar_message_center_selected"]; UITableViewController *discover = [[UITableViewController alloc] init]; [self addoneChildViewController:discover title:@"发现" imageName:@"tabbar_discover" selectedImageName:@"tabbar_discover_selected"]; UITableViewController *me = [[UITableViewController alloc] init]; [self addoneChildViewController:me title:@"我" imageName:@"tabbar_profile" selectedImageName:@"tabbar_profile_selected"]; CJTabBar *tabar = [[CJTabBar alloc] init]; tabar.composeDelegate = self; // 主要代码 [self setValue:tabar forKey:@"tabBar"];}- (void)tabBarCompose{ UITableViewController *compose = [[UITableViewController alloc] init]; UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:compose]; [self presentViewController:nav animated:YES completion:nil];}- (void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; }- (void)addoneChildViewController:(UIViewController *)childController title:(NSString *)title imageName:(NSString *)imageName selectedImageName:(NSString *)seletedImageName{ // 设置导航栏,tabar的title childController.title = title; // 设置tabar的图片 childController.tabBarItem.image = [UIImage imageNamed:imageName]; // 创建存储字体属性的可变字典 NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; dictionary[UITextAttributeTextColor] = [UIColor orangeColor]; dictionary[UITextAttributeTextShadowOffset] = [NSValue valueWithUIOffset:UIOffsetZero]; dictionary[UITextAttributeTextShadowColor] = [UIColor clearColor]; [childController.tabBarItem setTitleTextAttributes:dictionary forState:UIControlStateSelected]; NSMutableDictionary *dict = [NSMutableDictionary dictionary]; dict[UITextAttributeTextColor] = [UIColor blackColor]; dict[UITextAttributeTextShadowOffset] = [NSValue valueWithUIOffset:UIOffsetZero]; dict[UITextAttributeTextShadowColor] = [UIColor clearColor]; [childController.tabBarItem setTitleTextAttributes:dict forState:UIControlStateNormal]; // 设置tabar选中时的图片 UIImage *selectedImage = [UIImage imageNamed:seletedImageName]; if ([[UIDevice currentDevice].systemVersion doubleValue] >=7.0) {// 设置图片不可渲染(使用原图) selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; } childController.tabBarItem.selectedImage = selectedImage; // 创建包装子控制器的导航控制器 CJNavigationController *nav = [[CJNavigationController alloc] initWithRootViewController:childController]; // 添加自控制器 [self addChildViewController:nav]; }+ (void)initialize{ // 设置tabar字体的颜色, 这样也可以设置字体颜色和大小 // UITabBarItem *item = [UITabBarItem appearance]; // NSMutableDictionary *dict = [NSMutableDictionary dictionary]; // dict[NSForegroundColorAttributeName] = [UIColor blackColor]; // [item setTitleTextAttributes:dict forState:UIControlStateNormal];
}@end
CJNavigationController.h
//// CJNavigationController.h// 自定义Tabar//// Created by CoderJee on 15/1/25.// Copyright (c) 2015年 CoderJee. All rights reserved.//#import <UIKit/UIKit.h>@interface CJNavigationController : UINavigationController@end
CJNavigationController.m
//// CJNavigationController.m// 自定义Tabar//// Created by CoderJee on 15/1/25.// Copyright (c) 2015年 CoderJee. All rights reserved.//#import "CJNavigationController.h"@interface CJNavigationController ()@end@implementation CJNavigationController- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view.}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{ if (self.viewControllers.count > 0) { // 如果现在push的不是栈底控制器 // 隐藏tabar viewController.hidesBottomBarWhenPushed = YES; // 设置导航栏按钮 } [super pushViewController:viewController animated:animated];}- (void)back{ [self popViewControllerAnimated:YES];}- (void)more{ [self popToRootViewControllerAnimated:YES];}@end
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; CJTabBarController *controller = [[CJTabBarController alloc] init]; self.window.rootViewController = controller; [self.window makeKeyAndVisible]; return YES;}
UIView+Extension.h
//// UIView+Extension.h// DaiDaiFa//// Created by coder.j on 14-10-16.// Copyright (c) 2014年 com.daidaifa. All rights reserved.//#import <UIKit/UIKit.h>@interface UIView (Extension)@property (nonatomic, assign) CGFloat x;@property (nonatomic, assign) CGFloat y;@property (nonatomic, assign) CGFloat maxX;@property (nonatomic, assign) CGFloat maxY;@property (nonatomic, assign) CGFloat centerX;@property (nonatomic, assign) CGFloat centerY;@property (nonatomic, assign) CGFloat width;@property (nonatomic, assign) CGFloat height;@property (nonatomic, assign) CGSize size;@property (nonatomic, assign) CGPoint origin;@end
UIView+Extension.m
//// UIView+Extension.m// DaiDaiFa//// Created by coder.j on 14-10-16.// Copyright (c) 2014年 com.daidaifa. All rights reserved.//#import "UIView+Extension.h"@implementation UIView (Extension)- (void)setX:(CGFloat)x{ CGRect frame = self.frame; frame.origin.x = x; self.frame = frame;}- (CGFloat)x{ return self.frame.origin.x;}- (void)setMaxX:(CGFloat)maxX{ self.x = maxX - self.width;}- (CGFloat)maxX{ return CGRectGetMaxX(self.frame);}- (void)setMaxY:(CGFloat)maxY{ self.y = maxY - self.height;}- (CGFloat)maxY{ return CGRectGetMaxY(self.frame);}- (void)setY:(CGFloat)y{ CGRect frame = self.frame; frame.origin.y = y; self.frame = frame;}- (CGFloat)y{ return self.frame.origin.y;}- (void)setCenterX:(CGFloat)centerX{ CGPoint center = self.center; center.x = centerX; self.center = center;}- (CGFloat)centerX{ return self.center.x;}- (void)setCenterY:(CGFloat)centerY{ CGPoint center = self.center; center.y = centerY; self.center = center;}- (CGFloat)centerY{ return self.center.y;}- (void)setWidth:(CGFloat)width{ CGRect frame = self.frame; frame.size.width = width; self.frame = frame;}- (CGFloat)width{ return self.frame.size.width;}- (void)setHeight:(CGFloat)height{ CGRect frame = self.frame; frame.size.height = height; self.frame = frame;}- (CGFloat)height{ return self.frame.size.height;}- (void)setSize:(CGSize)size{// self.width = size.width;// self.height = size.height; CGRect frame = self.frame; frame.size = size; self.frame = frame;}- (CGSize)size{ return self.frame.size;}- (void)setOrigin:(CGPoint)origin{ CGRect frame = self.frame; frame.origin = origin; self.frame = frame;}- (CGPoint)origin{ return self.frame.origin;}@end
自定义UITabBar
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。