iOS 自定义TabBarController
转自:http://blog.csdn.net/xn4545945/article/details/35994863
一、自定义的思路
iOS中的TabBarController确实已经很强大了,大部分主流iOS应用都会采用。但是往往也不能满足全部的需求,因此需要自定义TabBar,自定义需要对系统的TabBar工作方式有很好的理解,自定义需要勇气。
自定义TabBar的原则:尽量利用系统自带TabBar,只改需要改的地方。
三、细节很重要
XNTabBarController.h
- #import <UIKit/UIKit.h>
@interface
@end
XNTabBarController.m
- //
// XNTabBarController.m
//
//
// Created by neng on 14-6-19.
// Copyright (c) 2014年 neng. All rights reserved.
//#import "XNTabBarController.h"
#import "Common.h"
#import "XNTabBarButton.h"@interface
/** - * 设置之前选中的按钮
- */
@propertynonatomicUIButton
@end@implementation
void
super]; - // NSLog(@"%s",__func__);
// NSLog(@"%@",self.view.subviews); //能打印出所有子视图,和其frameself);
- self.frame
self removeFromSuperview - UIView]];
- = rect;
- = [UIColor];
- self addSubview
forint; i < ; i++) {
- XNTabBarButton]];
- NSString:, i +];
- NSString:, i +];
- :[UIImage:imageName]:UIControlStateNormal];
- :[UIImage:imageNameSel]:UIControlStateSelected];
- i.size / ;
- = CGRectMake(x, , myView.size / , myView.size);
- :btn];
- = i;
- :self:@selector forControlEvents
- if == i) {
- = YES
self = btn; - /**
- * 自定义TabBar的按钮点击事件
- */
voidUIButton - self.selectedNO
- = YES
- self = button;
- self = button;
- @end
XNTabBarButton.h
- #import <UIKit/UIKit.h>
@interface
@end
XNTabBarButton.m
- #import "XNTabBarButton.h"
@implementation
/**什么也不做就可以取消系统按钮的高亮状态*/
voidBOOL
// [super setHighlighted:highlighted];@end
五、代码重构
(hidebottombaronpush)
XNTabBar.h
- #import <UIKit/UIKit.h>
@class@protocol
/** - * 工具栏按钮被选中, 记录从哪里跳转到哪里. (方便以后做相应特效)
- */
void tabBarXNTabBar:(NSInteger) from:(NSInteger)to; - @end
@interface
@propertynonatomicid
/** - * 使用特定图片来创建按钮, 这样做的好处就是可扩展性. 拿到别的项目里面去也能换图片直接用
- *
- * @param image 普通状态下的图片
- * @param selectedImage 选中状态下的图片
- */
voidUIImage:(UIImage
@end
XNTabBar.m
- //
// XNTabBar.m
//
// Created by neng on 14-6-19.
// Copyright (c) 2014年 neng. All rights reserved.
//#import "XNTabBar.h"
#import "XNTabBarButton.h"@interface
/** - * 设置之前选中的按钮
- */
@propertynonatomicUIButton
@end@implementation
/**
- * 在这个方法里写控件初始化的东西, 调用init方法时会调用
- */
//- (id)initWithFrame:(CGRect)frame {
// if (self = [super initWithFrame:frame]) {
// //添加按钮
// for (int i = 0; i < 5; i++) { //取消掉特定的数字
// //UIButton *btn = [[UIButton alloc] init];
// XNTabBarButton *btn = [[XNTabBarButton alloc] init];
//
// NSString *imageName = [NSString stringWithFormat:@"TabBar%d", i + 1];
// NSString *imageNameSel = [NSString stringWithFormat:@"TabBar%dSel", i + 1];
//
// [btn setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
// [btn setImage:[UIImage imageNamed:imageNameSel] forState:UIControlStateSelected];
//
// [self addSubview:btn];
//
// btn.tag = i; //设置按钮的标记, 方便来索引当前的按钮,并跳转到相应的视图
//
// //带参数的监听方法记得加"冒号"
// [btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
//
// if (0 == i) {
// [self clickBtn:btn];
// }
// }
// }
// return self;
//}voidUIImage:(UIImage
UIButton]]; - :image:UIControlStateNormal];
- :selectedImage:UIControlStateSelected];
- self:btn];
- :self:@selector forControlEvents
- ifself.count) {
- self:btn];
- /**专门用来布局子视图, 别忘了调用super方法*/
void
super]; - intself.count
forint; i < count; i++) { - UIButtonself[i];
- = i;
- iself.size / count;
- ;
- self.size / count;
- self.size;
- = CGRectMake(x, y, width, height);
- /**
- * 自定义TabBar的按钮点击事件
- */
voidUIButton - self.selectedNO
- = YES
- self = button;
- ifself respondsToSelector@selector
self tabBarself:self.tag:button]; - @end
原先的XNTabBarController.m经过修改后,注释了原先的代码。
- //
// XNTabBarController.m
//
// Created by neng on 14-6-19.
// Copyright (c) 2014年 neng. All rights reserved.
//#import "XNTabBarController.h"
#import "XNTabBarButton.h"
#import "XNTabBar.h"@interface
/** - * 设置之前选中的按钮
- */
@propertynonatomicUIButton
@end@implementation
void
super]; - // NSLog(@"%s",__func__);
// NSLog(@"%@",self.view.subviews); //能打印出所有子视图,和其frame
// LogFun;
// LogSubviews(self.view); - self.bounds
- self);
- XNTabBar]];
- = self
- = rect;
- self addSubview
- forint; i<self.count
- NSString:, i +];
- NSString:, i +];
- UIImage:imageName];
- UIImage:imageNameSel];
- :image:imageSel];
- // //添加按钮
// for (int i = 0; i < 5; i++) {
// //UIButton *btn = [[UIButton alloc] init];
// XNTabBarButton *btn = [[XNTabBarButton alloc] init];
//
// NSString *imageName = [NSString stringWithFormat:@"TabBar%d", i + 1];
// NSString *imageNameSel = [NSString stringWithFormat:@"TabBar%dSel", i + 1];
//
// [btn setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
// [btn setImage:[UIImage imageNamed:imageNameSel] forState:UIControlStateSelected];
//
// CGFloat x = i * myView.frame.size.width / 5;
// btn.frame = CGRectMake(x, 0, myView.frame.size.width / 5, myView.frame.size.height);
//
// [myView addSubview:btn];
//
// btn.tag = i;//设置按钮的标记, 方便来索引当前的按钮,并跳转到相应的视图
//
// //带参数的监听方法记得加"冒号"
// [btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
//
// //设置刚进入时,第一个按钮为选中状态
// if (0 == i) {
// btn.selected = YES;
// self.selectedBtn = btn; //设置该按钮为选中的按钮
// }
// }/**永远别忘记设置代理*/
voidXNTabBar:(NSInteger)from:(NSInteger)to { - self = to;
- /**
- * 自定义TabBar的按钮点击事件
- */
//- (void)clickBtn:(UIButton *)button {
// //1.先将之前选中的按钮设置为未选中
// self.selectedBtn.selected = NO;
// //2.再将当前按钮设置为选中
// button.selected = YES;
// //3.最后把当前按钮赋值为之前选中的按钮
// self.selectedBtn = button;
//
// //4.跳转到相应的视图控制器. (通过selectIndex参数来设置选中了那个控制器)
// self.selectedIndex = button.tag;
//}@end
自定义后的效果图:
例子源码下载 :http://download.csdn.net/detail/xn4545945/7572263
转载请注明出处:http://blog.csdn.net/xn4545945
iOS 自定义TabBarController的更多相关文章
- iOS 自定义tabBarController(中间弧形)
效果图 1.在继承自UITabBarController的自定义controller中调用以下方法(LZCustomTabbar为自定义的tabbar) - (void)viewDidAppear:( ...
- 【iOS自定义键盘及键盘切换】详解
[iOS自定义键盘]详解 实现效果展示: 一.实现的协议方法代码 #import <UIKit/UIKit.h> //创建自定义键盘协议 @protocol XFG_KeyBoardDel ...
- iOS自定义的UISwitch按钮
UISwitch开关控件 开关代替了点选框.开关是到目前为止用起来最简单的控件,不过仍然可以作一定程度的定制化. 一.创建 UISwitch* mySwitch = [[ UISwitchalloc] ...
- 如何实现 iOS 自定义状态栏
给大家介绍如何实现 iOS 自定义状态栏 Sample Code: 01 UIWindow * statusWindow = [[UIWindow alloc] initWithFrame:[UIAp ...
- iOS自定义组与组之间的距离以及视图
iOS自定义组与组之间的距离以及视图 //头视图高度 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(N ...
- iOS 自定义转场动画
代码地址如下:http://www.demodashi.com/demo/12955.html 一.总效果 本文记录分享下自定义转场动画的实现方法,具体到动画效果:新浪微博图集浏览转场效果.手势过渡动 ...
- iOS 自定义转场动画浅谈
代码地址如下:http://www.demodashi.com/demo/11612.html 路漫漫其修远兮,吾将上下而求索 前记 想研究自定义转场动画很久了,时间就像海绵,挤一挤还是有的,花了差不 ...
- iOS自定义转场动画实战讲解
iOS自定义转场动画实战讲解 转场动画这事,说简单也简单,可以通过presentViewController:animated:completion:和dismissViewControllerA ...
- iOS 实现Tabbarcontroller中间自定义样式 最简单的方法
先上图: 如果我们要实现中间按钮自定义样式,方法应该蛮多,这里介绍一种最简单的. 1.创建类继承:UITabBarController,如下代码都是写在该类的 .m文件里 2.定义最中间的自定义样式, ...
随机推荐
- linux 打包 | autoconf 使用方法
面试题 嵌入式 0x10道题目 宏定义 #define 宏体 宏体 (大写) #define SECOND_OF_YEAR (365*24*3600)UL 可移植性 数据声明 一个存有10个指针的数组 ...
- Helm 3 发布 | 云原生生态周报 Vol. 27
作者 | 墨封.元毅.冬岛.敖小剑.衷源 业界要闻 1.Helm 3 发布 美国时间 11 月 13 日,Helm 团队发布 Helm 3 第一个稳定版本.Helm 3 以 Helm 2 的核心特性为 ...
- javascript采用Broadway实现安卓视频自动播放的方法(这种坑比较多 不建议使用)
javascript采用Broadway实现安卓视频自动播放的方法Broadway 是一个 H.264 解码器, 比jsmpge清晰度要高 使用 Emscripten 工具从 Android 的 H. ...
- C++程序员学Python
目录 C++程序员学Python 第二章.变量和数据类型 1.注释语句前用#: 2.常用于大小写函数: 第三章.列表 1.列表简述 2.修改,增加,插入,删除列表元素 第四章操作列表 1.遍历 2.创 ...
- 实验:基于http的yum源
实验:基于http的yum源 selinux,firewalld已经关闭',系统为CentOS7 repodata所在的目录就是yum源 下面介绍了如何把本地光盘通过httpd服务器变成yum源:多个 ...
- 网络编程--UDP通讯
UTP传输 public class Send1 { public static void main(String[] args) throws Exception { Scanner sc=new ...
- java本地缓存
1.为什么要使用缓存 由于服务器.数据库.网络等资源有限,无法支撑越来越多的请求与计算量,所以将一部分数据放在缓存中,以此减小薄弱环节的计算量和请求流程. 网站中缓存的应用场景: 1:可 ...
- 软件 ---- idea启动
1.将配置转移到别的盘符,避免重做系统后,之前的配置就没了 找到安装的位置,默认安装的话地址一般是 C:\Program Files\JetBrains\IntelliJ IDEA 2017.2 ID ...
- Linux下编写-makefile-详细教程(跟我一起写-Makefile-Markdown整理版)
目录 概述 关于程序的编译和链接 Makefile 介绍 Makefile的规则 一个演示例子 make是怎样工作的 makefile中使用变量 让make自己主动推导 另类风格的makefile 清 ...
- 微擎JS资源请求 403
微擎JS资源请求 403 1.确认JS是否指定 type ==> text/javascript 2.确认src的路径是否正确,{MODULE_URL}项目的根目录带反斜杠 3.实例:(PS:t ...