封装实现一个自己的tabbar

实现效果:

原来效果:

 

实现对应的思路有:

1.首先你要拥有这样的一个控件CSTabBar,继承自tabbar,这样才能做到重构(废话)

2.你要在使用CSTabBar使用kvc来实现    [self setValue:newTab forKey:@"tabBar"];  newTab是自己设定的对应的tabbar

3.就可以开始构造自己的Tabbar了,构造的第一步当然是设置中间按钮的size。

4.改变对应的tabbar 里面item的大小,和对应点击事件发生的时候你要响应什么东西。

//
//  CSTabBar.m
//  diary
//
//  Created by asheng123 on 15/4/11.
//  Copyright (c) 2015年 asheng123. All rights reserved.
//

#import "CSTabBar.h"
@interface CSTabBar()
@property(nonatomic,weak)UIButton *plusButton;
@end
@implementation CSTabBar

-(instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        [self setPlusButton];
    }
    return self;
}
-(void)setPlusButton
{
    UIButton * plusButton=[[UIButton alloc]init];
    [plusButton setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button"] forState:UIControlStateNormal];
    [plusButton setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted];
    [plusButton setImage:[UIImage imageNamed:@"tabbar_compose_icon_add"] forState:UIControlStateNormal];
    [plusButton setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_highlighted"] forState:UIControlStateHighlighted];
    [self addSubview:plusButton];
    self.plusButton = plusButton;
}
-(void)layoutSubviews
{
    [super layoutSubviews];

    [self setupPlusButtonFrame];
    [self setupallTabBarFrame];
}
-(void)setupPlusButtonFrame
{
    self.plusButton.size = self.plusButton.currentBackgroundImage.size;
    self.plusButton.center = CGPointMake(self.width*0.5, self.height*0.5);
}
-(void)setupallTabBarFrame
{
    int index= 0;
    for (UIView *tabBarButton in self.subviews) {
//        [tabBarButton isKindOfClassL: NSClassFromString(@"UITabBarButton")];
        BOOL isTabBar =[tabBarButton isKindOfClass:NSClassFromString(@"UITabBarButton")];
        if (!isTabBar) {
            continue;
        }
        [self setTabBarButtonFrame:tabBarButton withIndex:index];
        [self setTabBarButtonTextColor:tabBarButton withIndex:index];

        index++;
    }

}
//设置每一个tabbar对应的frame
//传进来的tabbar   也就是当前的一个按钮,那么要给他设定对应的值
-(void)setTabBarButtonFrame:(UIView *)tabBar withIndex:(int)index
{
    //首先取大小
    CGFloat tabWidth= self.width/(self.items.count +1);
    CGFloat tabHeight = self.height;

    //然后就是给对应控件赋值了
    if (index>=2) {
        tabBar.frame = CGRectMake(tabWidth*(index +1), 0, tabWidth, tabHeight);
    }else
    {
        tabBar.frame = CGRectMake(tabWidth *index, 0, tabWidth, tabHeight);
    }

}
//设置每一个tabbar对应的背景color
-(void)setTabBarButtonTextColor:(UIView *)tabBar withIndex:(int)index
{
    //要给每一个选中的tabbar对应一个background
    //比较重要的就是判断对应的index和当前选中的项目是不是相同
    int currentSelect= (int)[self.items indexOfObject:self.selectedItem];
    //判断对应的是不是选中的项
    for (UILabel *label in tabBar.subviews) {
        if (![label isKindOfClass:NSClassFromString(@"UILabel")]) {
            continue;
        }
        if (currentSelect == index) {
            label.textColor = [UIColor orangeColor];
        }else
        {
            label.textColor = [UIColor blackColor];
        }
    }
}
@end

其中index这个设计的比较巧妙。通过遍历来找到对应的index,判断是否是相同的一个属性,isKindOfClass可以判断,因为这个事对应的子类中的方法,可以判断出是什么调用了这个方法。之间存在着继承关系

时间: 2024-10-13 04:02:43

封装实现一个自己的tabbar的相关文章

自己封装的一个JS分享组件

因为工作的需求之前也封装过一个JS分享插件,集成了我们公司常用的几个分享平台. 但是总感觉之前的结构上很不理想,样式,行为揉成一起,心里想的做的完美,实际上总是很多的偏差,所以这次我对其进行了改版. 这次的核心就是:JS只负责事件+结构,也就是把功能实现出来,具体的外观样式,则使用者自己进行定义. 以下是新版分享插件的代码: 1 (function(root){ 2 'use strict'; 3 function share(params){ 4 5 this.params = params;

使用 ViewPager 和 RadioGroup 封装的一个导航控件

import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.drawable.Drawable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager;

封装的一个sorted_vector示例,实现了stl::set的一部分接口

STL set能保证最坏情况下的查找和插入效率,logN.但是维护红黑树开销较大.set内的元素按照一定的逻辑顺序组织,查找.插入等操作的结果都和排序规则有关. 适合STL set的情况为: 1.集合很大,以至于O(N)远大于O(longN).2.查找和插入的次数一样多,且需要考虑插入的效率.3.集合内的元素以随机顺序插入.4.查找和插入交叉进行. 在对插入效率要求不高,或者特定情况下插入效率可以接受时,使用sorted vector也可以实现O(longN)的查找.而且std的sort.low

使用原生JS实现一个风箱式的demo,并封装了一个运动框架

声明,该DEMO依托于某个培训机构中,非常感谢这个培训结构.话不多说,现在开始改demo的制作. 首先,在前端的学习过程中,轮播图是我们一定要学习的,所以为了更加高效的实现各种轮播图,封装了一个运动的框架. 1 function getStyle(obj,attr) { 2 if(obj.currentStyle){ 3 return obj.currentStyle[attr];//为了获取IE下的属性值 4 }else{ 5 return window.getComputedStyle(ob

朋友封装的一个ASP.NET上传文件的方法

自我感觉封装得还不错!!! 代码如下: C#代码   #region 上传文件的方法 /// <summary> /// 上传文件方法 /// </summary> /// <param name="myFileUpload">上传控件ID</param> /// <param name="allowExtensions">允许上传的扩展文件名类型,如:string[] allowExtensions = 

在jsp提交表单的参数封装到一个方法里

建议去看一下孤傲苍狼写的Servlet+JSP+JavaBean开发模式(http://www.cnblogs.com/xdp-gacl/p/3902537.html), 最好把他JavaWeb学习总结全部看完会有很大的收获哦! 而把jsp专递的参数封装到一个方法里面也是从他那里学到的. 我觉得特别有用,尤其是在做项目的时候能省很多的代码  一: 需要的包 根据上一篇JDBC+Servlet+jsp(http://www.cnblogs.com/zhu520/p/6913650.html)的内容

自己封装的一个LoadRes组件

这两周一直太忙,没有好好处理上上上周遇到的一个让我加班到凌晨的问题,这个问题是判断flash的加载. 之前的思路是让flash的人在制作flash的时候,加入了一个回调方法,该方法再会回调我页面的方法. 想象虽然很丰满,但是现实确很骨感,由于页面资源的加载顺序问题,如果flash是通过缓存读取得到的,那么flash便会先于我的脚本加载,这时便会出现flash调不到我定义的方法.但是由于功能的原因以及考虑页面的整洁性,我又不能将脚本放入到head中,最终的解决思路就是在head中加入一个scrip

把XML文档中的每一本书封装到一个book对象,并把多个book对象放到一个list集合当中返回

1 package sax; 2 3 import java.awt.print.Book; 4 import java.io.IOException; 5 import java.util.ArrayList; 6 import java.util.List; 7 8 import javax.xml.parsers.ParserConfigurationException; 9 import javax.xml.parsers.SAXParser; 10 import javax.xml.p

朋友封装的一个ASP.NET上传文件的方法(转)

#region 上传文件的方法 /// <summary> /// 上传文件方法 /// </summary> /// <param name="myFileUpload">上传控件ID</param> /// <param name="allowExtensions">允许上传的扩展文件名类型,如:string[] allowExtensions = { ".doc", ".