【新浪微博项目】05--自定义TabBarButton

1.TabBar的层次结构

2.自定义TabBar的背景

可以将一个很短的图片拉长作为背景图片,方法:

self.backgroundColor = [UIColor
colorWithPatternImage:[UIImage
imageWithName:@"tabbar_background"]];

- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        if (!iOS7) { // 非iOS7下,设置tabbar的背景
            self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageWithName:@"tabbar_background"]];
        }
    }
    return self;
}

设置UIImage中imageWithName中的自动提示:

可以通过拷贝Item,然后修改Value中的值为imageWithName:

3.设置点击选中的按钮

@property (nonatomic,
weak) IWTabBarButton *selectedButton;

- (void)addTabBarButtonWithItem:(UITabBarItem *)item
{
    // 1.创建按钮
    IWTabBarButton *button = [[IWTabBarButton alloc] init];
    [self addSubview:button];

    // 2.设置数据
    button.item = item;

    // 3.监听按钮点击
    [button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchDown];

    // 4.默认选中第0个按钮
    if (self.subviews.count == 1) {
        [self buttonClick:button];
    }
}
- (void)buttonClick:(IWTabBarButton *)button
{
    //1.当年被选中的按钮取消选中
    self.selectedButton.selected = NO;
    //2.被点击的按钮设置选中
    button.selected = YES;
    //3.被点击的按钮变为选中按钮
    self.selectedButton = button;
}

4.自定义按钮

①设置按钮内部图片在上面,文字描述在下面

// 内部图片的frame
- (CGRect)imageRectForContentRect:(CGRect)contentRect
{
    CGFloat imageW = contentRect.size.width;
    CGFloat imageH = contentRect.size.height * IWTabBarButtonImageRatio;
    return CGRectMake(0, 0, imageW, imageH);
}

// 内部文字的frame
- (CGRect)titleRectForContentRect:(CGRect)contentRect
{
    CGFloat titleY = contentRect.size.height * IWTabBarButtonImageRatio;
    CGFloat titleW = contentRect.size.width;
    CGFloat titleH = contentRect.size.height - titleY;
    return CGRectMake(0, titleY, titleW, titleH);
}

②去掉高亮

// 重写去掉高亮状态
- (void)setHighlighted:(BOOL)highlighted {}

③设置图片和文字状态

- (id)initWithFrame:(CGRect)frame
{

    self = [super initWithFrame:frame];
    if (self) {
        // 图标居中
        self.imageView.contentMode = UIViewContentModeCenter;
        // 文字居中
        self.titleLabel.textAlignment = NSTextAlignmentCenter;
        // 字体大小
        self.titleLabel.font = [UIFont systemFontOfSize:11];
        // 文字颜色
        [self setTitleColor:IWTabBarButtonTitleColor forState:UIControlStateNormal];
        [self setTitleColor:IWTabBarButtonTitleSelectedColor forState:UIControlStateSelected];

        if (!iOS7) { // 非iOS7下,设置按钮选中时的背景
            [self setBackgroundImage:[UIImage imageWithName:@"tabbar_slider"] forState:UIControlStateSelected];
        }
    }
    return self;
}

④对按钮的属性进行封装

@property (nonatomic,
strong) UITabBarItem *item;

// 设置item
- (void)setItem:(UITabBarItem *)item
{
    _item = item;

    [self setTitle:item.title forState:UIControlStateNormal];
    [self setImage:item.image forState:UIControlStateNormal];
    [self setImage:item.selectedImage forState:UIControlStateSelected];

}

5.TabBar内部的点击通过代理或者通知告诉控制器

在TarBar的头文件中添加代理对象:

#import <UIKit/UIKit.h>

@class IWTabBar;

@protocol IWTabBarDelegate <NSObject>

@optional
- (void)tabBar:(IWTabBar *)tabBar didSelectedButtonFrom:(int)from to:(int)to;

@end

@interface IWTabBar : UIView
- (void)addTabBarButtonWithItem:(UITabBarItem *)item;

@property (nonatomic, weak) id<IWTabBarDelegate> delegate;

@end

在点击按钮的时候,通知代理,这里给按钮绑定tag

/**
 *  监听按钮点击
 */
- (void)buttonClick:(IWTabBarButton *)button
{
    // 1.通知代理
    if ([self.delegate respondsToSelector:@selector(tabBar:didSelectedButtonFrom:to:)]) {
        [self.delegate tabBar:self didSelectedButtonFrom:self.selectedButton.tag to:button.tag];
    }
    // 2.设置按钮的状态
    //1.当年被选中的按钮取消选中
    self.selectedButton.selected = NO;
    //2.被点击的按钮设置选中
    button.selected = YES;
    //3.被点击的按钮变为选中按钮
    self.selectedButton = button;
}

在MRRootTarBarController中获得代理

@interface MRRootTabBarController ()<IWTabBarDelegate>

获得代理:

customTabBar.delegate =
self;

/**
 *  监听tabbar按钮的改变
 *  @param from   原来选中的位置
 *  @param to     最新选中的位置
 */
- (void)tabBar:(IWTabBar *)tabBar didSelectedButtonFrom:(int)from to:(int)to
{
    self.selectedIndex = to;
}
时间: 2024-10-17 02:49:19

【新浪微博项目】05--自定义TabBarButton的相关文章

WPF学习- 新建项目后自定义Main()[Type &#39;App&#39; already defines a member called &#39;Main&#39; with the same parameter types]

问题点: 在App.xaml.cs中自己添加Main方法,编译会出现如下报错: 错误 CS0111 类型“App”已定义了一个名为“Main”的具有相同参数类型的成员  错误 Type 'App' already defines a member called 'Main' with the same parameter types  错误 CS0017 程序定义了多个入口点.使用 /main (指定包含入口点的类型)进行编译.  原因: 默认方式新建WPF项目时,编译时会自动生成Main方法(

Android项目中自定义顶部标题栏

Android项目中自定义顶部标题栏 下面给大家详细介绍android中自定义顶部标题栏的思路及实现方式 先来图:     思路及实现步骤 1.定义标题栏布局 2.自定义TitleActivity控制标题栏按钮监听 3.在TitleActivity中实现标题栏以下内容切换 首先定义标题栏 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http:/

呕心沥血的java复杂项目(包括自定义应用层协议、CS多线程、多客户端登录、上下线提醒等等)

建议大家先下源代码,导入到Eclipse,然后运行服务器和多个客户端,这样有个不错的体会.下载地址:http://download.csdn.net/detail/woshiwanghao_hi/7320927. 首先来看下整个系统的文件架构图: 系统是个基于UDP的聊天室,因为不能保持所有用户和聊天室的持续连接.同时为了保持数据传输的可靠性,就需要自定义应用层协议了. 程序大概的一个流程如下: 1.启动服务器,点击"start service",之后服务器及开始监听指定端口. 2.启

构建maven项目,自定义目录结构方法

构建maven项目 创建自定义的文件目录方法: 在项目名称右键-->Builder Path-->Configure Builder Path...Source菜单下的Add Folder按钮 不用勾选选框,直接选中要创建的目录分支后,点击下面的Create New Folder按钮,写目标目录的名称,finish OK-->Apply --> Apply and close 原文地址:https://www.cnblogs.com/jasonma/p/11320454.html

新浪微博项目中我学会的东西

微博中我学会的东西: 1.项目环境的搭建(推送,版本号,支持的iOS几版本几以上的,用与不用StoryBoard两种建立方式,APPIcon,启动图片的两种方式,还有项目类的前缀) 1.1 创建窗口: //创建窗口 //不能使用局部变量(UIWindow *window) self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; self.window.backgroundColo

GitHub Pages和每个项目绑定自定义域名(支持多个和顶级域名)

假设我购买的域名为www.easonjim.com,想把www.easonjim.com和easonjim.com的域名跳转到下面的网址easonjim.github.io. 而我在github上的账号为easonjim,并且新建了easonjim.github.io的目录. 那么在这个目录上新建一个名为CNAME的文件,里面的内容: easonjim.com www.easonjim.com 下一步是设置域名的解析地址,如下设置: 只要把@和www解析到github的ip即可. 参考: htt

XAMPP项目目录自定义后403 Access Forbidden

XAMPP安装过程不细述了,先来简单回顾一下XAMPP配置: \xampp\apache\conf\extra\httpd-vhosts.conf <VirtualHost *:80> ServerAdmin [email protected]domain.td DocumentRoot "盘符:/路径/项目目录" ServerName domain.td # domain.td 为自定义服务器名,只要你喜欢...随意 ServerAlias www.domain.td #

github上开源项目MJRefresh自定义刷新控件

前言:在项目开发过程中经常有需要进行刷新操作,MJ博主开源的MJRefresh为我们节省了大量的时间.只需要几行代码就可给UITableview,UICollectionview,UISCrollview,UIWebview集成上拉或下拉操作.更强大的是自定义功能,无论产品经理要什么上拉下拉动态效果,MJRefresh带你装逼带你酷炫下拉刷新.先来看看自定义下拉的动态效果. 1 利用cocoapods安装MJRefresh,如果不明白cocoapods使用方法,请参照cocopods安装和使用教

IOSApplication新建Empty项目中自定义UIButton

最近刚开始学IOS,用的Xcode5中默认生成的Storyboard中控件的好多属性设置不了,所以就尝试在空项目里手写button,如有错误,请指正,共同学习. 1.新建ViewController类,我起的名字是MCViewController. 2.创建mccontroller控制器,并设置window的根视图为mccontroller. AppDelegate.m 1 - (BOOL)application:(UIApplication *)application didFinishLau