zoukankan      html  css  js  c++  java
  • 自定义UITabbarcontrollerview

    // 初始化contentView
    [self initContentView];

    #pragma mark 初始化contentView
    - (void)initContentView {
        CGSize size = self.view.bounds.size;
        UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height - kTabbarHeight)];
        contentView.backgroundColor = [UIColor colorWithRed:0.8 green:0.8 blue:0.8 alpha:1];
        [self.view addSubview:contentView];
        [contentView release];
        _contentView = contentView;
    }

    // 设置主题
    [self initTheme];

    #pragma mark 设置主题
    - (void)initTheme {
        // 设置导航栏背景
        UIImage *navBg = [UIImage resizeImage:@"navigationbar_background.png"];
        [[UINavigationBar appearance] setBackgroundImage:navBg forBarMetrics:UIBarMetricsDefault];
        
        // 设置导航栏文字属性
        NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
        // 设置文字颜色
        [attrs setObject:[UIColor blackColor] forKey:UITextAttributeTextColor];
        [[UINavigationBar appearance] setTitleTextAttributes:attrs];
    }

    // 初始化所有的子控制器
    [self initControllers];

    #pragma mark 初始化子控制器
    - (void)initControllers {
        _items = [NSMutableArray array];
        
        HomeController *home = [[HomeController alloc] init];
        [self addController:home title:@"首页" normal:@"tabbar_home.png" highlighted:@"tabbar_home_highlighted.png"];
        [home release];
        
        MyDataController *data = [[MyDataController alloc] init];
        [self addController:data title:@"我的资料" normal:@"tabbar_message_center.png" highlighted:@"tabbar_message_center_highlighted.png"];
        [data release];
        
        FriendController *friend = [[FriendController alloc] init];
        [self addController:friend title:@"我的关注" normal:@"tabbar_profile.png" highlighted:@"tabbar_profile_highlighted.png"];
        [friend release];
        
        FollowerController *follower = [[FollowerController alloc] init];
        [self addController:follower title:@"我的粉丝" normal:@"tabbar_discover.png" highlighted:@"tabbar_discover_highlighted.png"];
        [follower release];
        
        UIViewController *more = [[UIViewController alloc] init];
        more.view.backgroundColor = [UIColor redColor];
        [self addController:more title:@"更多" normal:@"tabbar_more.png" highlighted:@"tabbar_more_highlighted.png"];
        [more release];
    }
    =========================================
    #pragma mark 添加子控制器和item
    - (void)addController:(UIViewController *)vc title:(NSString *)title normal:(NSString *)normal highlighted:(NSString *)highlighted {
        // 初始化item
        MJTabbarItemDesc *item = [MJTabbarItemDesc itemWithTitle:title normal:normal highlighted:highlighted];
        [_items addObject:item];
        
        // 设置控制器的标题
        vc.title = title;
        
        // 包装控制器
        UINavigationController *nav1 = [[UINavigationController alloc] initWithRootViewController:vc];
        
        nav1.delegate = self;
        
        // 对子控制器做了一次retain
        [self addChildViewController:nav1];
        [nav1 release];
    }
    
    
    
     

    // 初始化tabbar
    [self initTabbar];

    #pragma mark - 私有方法
    #pragma mark 初始化tabbar
    - (void)initTabbar {
        CGSize size = self.view.bounds.size;
        CGRect frame = CGRectMake(0, size.height - kTabbarHeight, size.width, kTabbarHeight);
        MJTabbar *tab = [[MJTabbar alloc] initWithFrame:frame items:_items];
        // 设置代理
        tab.delegate = self;
        [self.view addSubview:tab];
        [tab release];
        
        _tabbar = tab;
    }

    ============================================
    //  自定义Tabbar
    
    #import <UIKit/UIKit.h>
    
    @protocol MJTabbarDelegate <NSObject>
    - (void)tabbarItemChangeFrom:(int)from to:(int)to;
    @end
    
    @interface MJTabbar : UIView
    // items : 有多少个标签
    - (id)initWithFrame:(CGRect)frame items:(NSArray *)items;
    
    @property (nonatomic, assign) id<MJTabbarDelegate> delegate;
    @end
    
    
    #import "MJTabbar.h"
    #import "MJTabbarItem.h"
    
    @interface MJTabbar() {
        // 当前被选中的tabbaritem
        MJTabbarItem *_current;
    }
    @end
    
    @implementation MJTabbar
    
    #pragma mark item点击
    - (void)itemClick:(MJTabbarItem *)new {
        // 设置selected为YES,就能达到UIControlStateSelected状态
        if (_current != new) {
            if ([self.delegate respondsToSelector:@selector(tabbarItemChangeFrom:to:)]) {
                [self.delegate tabbarItemChangeFrom:_current.tag to:new.tag];
            }
            
            _current.userInteractionEnabled = YES;
            new.userInteractionEnabled = NO;
            
            new.selected = YES;
            _current.selected = NO;
            
            _current = new;
        }
    }
    
    #pragma mark 构造方法
    - (id)initWithFrame:(CGRect)frame items:(NSArray *)items {
        if (self = [super initWithFrame:frame]) {
            // colorWithPatternImage : 平铺一张图片来生成背景颜色
            self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"tabbar_background.png"]];
            
            int count = items.count;
            CGFloat itemHeight = self.bounds.size.height;
            CGFloat itemWidth = self.bounds.size.width / count;
                    
            for (int index = 0; index < count; index++) {
                MJTabbarItemDesc *desc = [items objectAtIndex:index];
                CGFloat itemX = index * itemWidth;
                CGRect itemFrame = CGRectMake(itemX, 0, itemWidth, itemHeight);
                MJTabbarItem *item = [[MJTabbarItem alloc] initWithFrame:itemFrame itemDesc:desc];
                
                // 设置一个标记
                item.tag = index;
                
                [item addTarget:self action:@selector(itemClick:) forControlEvents:UIControlEventTouchUpInside];
                
                [self addSubview:item];
                [item release];
                
                if (index == 0) {
                    // 让第0个item选中
                    [self itemClick:item];
                }
            }
            
        }
        return self;
    }
    
    @end

    自定义导航按钮
    #import <UIKit/UIKit.h>
    @class MJTabbarItemDesc;
    
    @interface MJTabbarItem : UIButton
    - (id)initWithFrame:(CGRect)frame itemDesc:(MJTabbarItemDesc *)desc;
    @end
    
    @interface MJTabbarItemDesc : NSObject
    @property (nonatomic, copy) NSString *title; // 标题
    @property (nonatomic, copy) NSString *normal; //默认图标
    @property (nonatomic, copy) NSString *highlighted; // 高亮图标
    
    + (id)itemWithTitle:(NSString *)title normal:(NSString *)normal highlighted:(NSString *)highlighted;
    @end
    
    
    #import "MJTabbarItem.h"
    
    @implementation MJTabbarItem
    
    - (id)initWithFrame:(CGRect)frame itemDesc:(MJTabbarItemDesc *)desc {
        if (self = [super initWithFrame:frame]) {
            // 设置高亮显示的背景
            [self setHighlightedBg:@"tabbar_slider.png"];
            // 设置selected=YES时的背景
            [self setSelectedBg:@"tabbar_slider.png"];
            
            // 设置默认的Image
            [self setImage:[UIImage imageNamed:desc.normal] forState:UIControlStateNormal];
            // 设置selected=YES时的image
            [self setImage:[UIImage imageNamed:desc.highlighted] forState:UIControlStateSelected];
            
            // 不需要在用户长按的时候调整图片为灰色
            self.adjustsImageWhenHighlighted = NO;
            // 设置UIImageView的图片居中
            self.imageView.contentMode = UIViewContentModeCenter;
            
            // 设置文字
            [self setTitle:desc.title forState:UIControlStateNormal];
            // 设置文字居中
            self.titleLabel.textAlignment = NSTextAlignmentCenter;
            // 设置字体大小
            self.titleLabel.font = [UIFont systemFontOfSize:10];
        }
        return self;
    }
    
    #pragma mark - 覆盖父类的2个方法
    #pragma mark 设置按钮标题的frame
    - (CGRect)titleRectForContentRect:(CGRect)contentRect {
        UIImage *image =  [self imageForState:UIControlStateNormal];
        CGFloat titleY = image.size.height - 3;
        CGFloat titleHeight = self.bounds.size.height - titleY;
        return CGRectMake(0, titleY, self.bounds.size.width,  titleHeight);
    }
    #pragma mark 设置按钮图片的frame
    - (CGRect)imageRectForContentRect:(CGRect)contentRect {
        UIImage *image =  [self imageForState:UIControlStateNormal];
        return CGRectMake(0, 0, self.bounds.size.width, image.size.height);
    }
    
    @end
    
    @implementation MJTabbarItemDesc
    + (id)itemWithTitle:(NSString *)title normal:(NSString *)normal highlighted:(NSString *)highlighted {
        MJTabbarItemDesc *desc = [[MJTabbarItemDesc alloc] init];
        desc.title = title;
        desc.normal = normal;
        desc.highlighted = highlighted;
        return [desc autorelease];
    }
    
    - (void)dealloc {
        [_title release];
        [_normal release];
        [_highlighted release];
        [super dealloc];
    }
    @end
    
    
    
    tabbar和导航控制用代理的交互
    #pragma mark - MJTabbar的代理方法
    // 在这里切换子控制器
    - (void)tabbarItemChangeFrom:(int)from to:(int)to {
        // 取出旧控制器
        UIViewController *old = [self.childViewControllers objectAtIndex:from];
        // 移除旧控制器的view
        [old.view removeFromSuperview];
        
        // 取出新控制器
        UIViewController *new = [self.childViewControllers objectAtIndex:to];
        new.view.frame = _contentView.bounds;
        // 添加新控制器的view
        [_contentView addSubview:new.view];
        
        // 执行动画
        if (from != to) {
            CATransition *anim = [CATransition animation];
            anim.duration = 0.15;
            anim.type = kCATransitionPush;
            anim.subtype = (to > from)?kCATransitionFromRight:kCATransitionFromLeft;
            [_contentView.layer addAnimation:anim forKey:nil];
        }
    }
    导航控制器代理方法
    #pragma mark 返回
    - (void)back {
        [_currentController.navigationController popViewControllerAnimated:YES];
    }
    
    #pragma mark home
    - (void)home {
        [_currentController.navigationController popToRootViewControllerAnimated:YES];
    }
    
    #pragma mark - 导航控制器代理方法
    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
        UIViewController *root = [navigationController.viewControllers objectAtIndex:0];
        if (viewController == root) {
            // 回到根控制器,显示tabbar
            [UIView animateWithDuration:0.3 animations:^{
                // 显示tabbar
                CGRect frame = _tabbar.frame;
                frame.origin.y = self.view.bounds.size.height - _tabbar.bounds.size.height;
                _tabbar.frame = frame;
                
                // 改变contentView的高度
                frame = _contentView.frame;
                frame.size.height = _tabbar.frame.origin.y;
                _contentView.frame = frame;
            }];
            
        } else {
            // 左边的返回按键
            UIButton *btn = [[UIButton alloc] init];
            UIImage *back = [UIImage imageNamed:@"navigationbar_back.png"];
            [btn setBackgroundImage:back forState:UIControlStateNormal];
            UIImage *back2 = [UIImage imageNamed:@"navigationbar_back_highlighted.png"];
            [btn addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
            [btn setBackgroundImage:back2 forState:UIControlStateHighlighted];
            btn.bounds = CGRectMake(0, 0, back.size.width, back.size.height);
            
            UIBarButtonItem *left = [[[UIBarButtonItem alloc] initWithCustomView:btn] autorelease];
            viewController.navigationItem.leftBarButtonItem = left;
            
            // 右边的home按键
            btn = [[UIButton alloc] init];
            UIImage *home = [UIImage imageNamed:@"navigationbar_home.png"];
            [btn setBackgroundImage:home forState:UIControlStateNormal];
            UIImage *home2 = [UIImage imageNamed:@"navigationbar_home_highlighted.png"];
            [btn addTarget:self action:@selector(home) forControlEvents:UIControlEventTouchUpInside];
            [btn setBackgroundImage:home2 forState:UIControlStateHighlighted];
            btn.bounds = CGRectMake(0, 0, home.size.width, home.size.height);
            
            UIBarButtonItem *right = [[[UIBarButtonItem alloc] initWithCustomView:btn] autorelease];
            viewController.navigationItem.rightBarButtonItem = right;
            
            // 跳到其他控制器,隐藏tabbar
            [UIView animateWithDuration:0.3 animations:^{
                // 隐藏tabbar
                CGRect frame = _tabbar.frame;
                frame.origin.y = self.view.bounds.size.height;
                _tabbar.frame = frame;
                
                // 改变contentView的高度
                frame = _contentView.frame;
                frame.size.height = self.view.bounds.size.height;
                _contentView.frame = frame;
            }];
            
            _currentController = viewController;
        }
    }



    
    
    
     
  • 相关阅读:
    Android-使用AIDL挂断电话
    新变化---转战新博客
    Spring Cloud Config 分布式配置中心【Finchley 版】
    Spring Boot2.0 整合 Kafka
    Spring Cloud 分布式链路跟踪 Sleuth + Zipkin + Elasticsearch【Finchley 版】
    Spring MVC 5 + Thymeleaf 基于Java配置和注解配置
    【机器学习】使用gensim 的 doc2vec 实现文本相似度检测
    【机器学习】SKlearn + XGBoost 预测 Titanic 乘客幸存
    【深度学习】keras + tensorflow 实现猫和狗图像分类
    iScroll.js 向上滑动异步加载数据回弹问题
  • 原文地址:https://www.cnblogs.com/gcb999/p/3151992.html
Copyright © 2011-2022 走看看