zoukankan      html  css  js  c++  java
  • 自定义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
    文件:%s
    行数:%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
  • 相关阅读:
    INSERT VALUES 语句
    SQL Server UNION
    SQL Server自定义函数(Scalarvalued Functions)
    设计一程序(Copy.java),可以实现文件的复制操作
    Eclipse 乱码 解决方案总结(UTF8 GBK)
    Java Collection: List、Set、 Map、 HashMap、 Hashtable、 Vector
    [Linux内核]从开机加电到main函数执行前的过程
    eclipse设置本地Javadoc API路径
    归并排序的递归和非递归实现(C代码)
    解决安装MySQL5.1出现Cannot create windows service for mysql.error:0
  • 原文地址:https://www.cnblogs.com/Fc-ios/p/4249244.html
Copyright © 2011-2022 走看看