在上一篇中,我们基本已经把整个框架都搭建出来了,下面进行代码重构一下。

思路:

  1. 导航按钮,按下时,会变灰,那是系统自带了,通过自定义UIButton,实现按下按钮立即切换效果。
  2. MJTabBarController管得太多了,只需要传图片过去,即创建好一个TabBar.
  3. 通过代理实现底部tabbar的切换。

一.自定义UIButton,继承自UIButton。MJTabBarButton.m

#import "MJTabBarButton.h"

@implementation MJTabBarButton

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
} /**
* 只要覆盖了这个方法,按钮就不存在高亮状态
*/
- (void)setHighlighted:(BOOL)highlighted
{
//
}
@end

二.定义一个View,封装创建tarbar按钮的方法。

MJTabBar.h

#import <UIKit/UIKit.h>

@interface MJTabBar : UIView
-(void)addTabBarWithName:(NSString *)name selName:(NSString *)selName;
@end

MJTabBar.m

//
// MJTabBar.m
// Lottery
//
// Created by jiangys on 15/8/30.
// Copyright (c) 2015年 weconex. All rights reserved.
// #import "MJTabBar.h"
#import "MJTabBarButton.h" @implementation MJTabBar //创建tabBar按钮
-(void)addTabBarWithName:(NSString *)name selName:(NSString *)selName
{
MJTabBarButton *button=[MJTabBarButton buttonWithType:UIButtonTypeCustom]; //设置图片
[button setBackgroundImage:[UIImage imageNamed:name] forState:UIControlStateNormal];
[button setBackgroundImage:[UIImage imageNamed:selName] forState:UIControlStateSelected]; //添加
[self addSubview:button];
} //该方法通常是设置控件的尺寸,initWithFrame负责创建控件,initWithFrame下的frame是没有值的。
-(void)layoutSubviews
{
[super layoutSubviews];
NSUInteger count=self.subviews.count;
for (NSUInteger i=; i<count; i++) {
MJTabBarButton *button=self.subviews[i];
button.tag=i; //设置frame
CGFloat buttonY=;
CGFloat buttonW=self.frame.size.width/count;
CGFloat buttonH=self.frame.size.height;
CGFloat buttonX=i*buttonW;
button.frame=CGRectMake(buttonX, buttonY, buttonW, buttonH);
}
} @end

那么,MJTabBarController.m里加载底部的tabBar就很简单了

//
// MJTabBarController.m
// Lottery
//
// Created by apple on 15/8/27.
// Copyright (c) 2015年 weconex. All rights reserved.
// #import "MJTabBarController.h"
#import "MJTabBar.h" @interface MJTabBarController ()@end @implementation MJTabBarController - (void)viewDidLoad {
[super viewDidLoad]; // 1.添加自己的tabbar
MJTabBar *myTabBar = [[MJTabBar alloc] init];
myTabBar.frame = self.tabBar.bounds;
[self.tabBar addSubview:myTabBar]; // 2.添加5个按钮
for (int i = ; i<self.viewControllers.count; i++) {
NSString *name=[NSString stringWithFormat:@"TabBar%d",i+];
NSString *selName=[NSString stringWithFormat:@"TabBar%dSel",i+];
[myTabBar addTabBarWithName:name selName:selName];
}
}
@end

运行后的效果:

目前还不能点击底部的那几个tarBar按钮,拉下来,我们通过代理的方式来实现。

三.通过代理方式实现底部按钮点击切换

1.定义协议。在MJTabBar.h文件最上边声明协议

@class MJTabBar;

@protocol MJTabBarDelegate <NSObject>
-(void)tabBar:(MJTabBar *)tabBar didSelectButtonFrom:(int)from to:(int)to;
@end

2.定义代理。继续在MJTabBar.h中声明一个委托的变量

//声明委托变量
@property(nonatomic,weak)id<MJTabBarDelegate> delegate;

MJTabBar.h完整代码

#import <UIKit/UIKit.h>
@class MJTabBar; @protocol MJTabBarDelegate <NSObject>
-(void)tabBar:(MJTabBar *)tabBar didSelectButtonFrom:(int)from to:(int)to;
@end @interface MJTabBar : UIView
//声明委托变量
@property(nonatomic,weak)id<MJTabBarDelegate> delegate;
-(void)addTabBarWithName:(NSString *)name selName:(NSString *)selName;
@end

3.通知代理。在MJTabBar.m完整代码

//
// MJTabBar.m
// Lottery
//
// Created by jiangys on 15/8/30.
// Copyright (c) 2015年 weconex. All rights reserved.
// #import "MJTabBar.h"
#import "MJTabBarButton.h" @interface MJTabBar()
/**
* 记录当前选中的按钮
*/
@property (nonatomic, weak) UIButton *selectedButton;
@end @implementation MJTabBar //创建tabBar按钮
-(void)addTabBarWithName:(NSString *)name selName:(NSString *)selName
{
MJTabBarButton *button=[MJTabBarButton buttonWithType:UIButtonTypeCustom]; //设置图片
[button setBackgroundImage:[UIImage imageNamed:name] forState:UIControlStateNormal];
[button setBackgroundImage:[UIImage imageNamed:selName] forState:UIControlStateSelected]; //添加
[self addSubview:button]; //监听
[button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchDown]; //默认选中第0个按钮
if (self.subviews.count==) {
[self buttonClick:button];
}
} //该方法通常是设置控件的尺寸,initWithFrame负责创建控件,initWithFrame下的frame是没有值的。
-(void)layoutSubviews
{
[super layoutSubviews];
NSUInteger count=self.subviews.count;
for (NSUInteger i=; i<count; i++) {
MJTabBarButton *button=self.subviews[i];
button.tag=i; //设置frame
CGFloat buttonY=;
CGFloat buttonW=self.frame.size.width/count;
CGFloat buttonH=self.frame.size.height;
CGFloat buttonX=i*buttonW;
button.frame=CGRectMake(buttonX, buttonY, buttonW, buttonH);
}
} /**
* 监听按钮点击
*/
-(void)buttonClick:(UIButton *)button
{
//通知代理
if ([self.delegate respondsToSelector:@selector(tabBar:didSelectButtonFrom:to:)]) {
[self.delegate tabBar:self didSelectButtonFrom:self.selectedButton.tag to:button.tag];
} // 1.让当前选中的按钮取消选中
self.selectedButton.selected = NO; // 2.让新点击的按钮选中
button.selected = YES; // 3.新点击的按钮就成为了"当前选中的按钮"
self.selectedButton = button;
} @end

4.委托页面,实现代理协议。MJTabBarController.m 实现

@interface MJTabBarController () <MJTabBarDelegate>
@end

5.委托页面,先让自己成为代理,并实现代理方法。MJTabBarController.m 实现:

 myTabBar.delegate = self;
- (void)tabBar:(MJTabBar *)tabBar didSelectButtonFrom:(int)from to:(int)to
{
// 选中最新的控制器
self.selectedIndex = to;
}

委托页面的完整代码:

#import "MJTabBarController.h"
#import "MJTabBar.h" @interface MJTabBarController () <MJTabBarDelegate>
@end @implementation MJTabBarController - (void)viewDidLoad
{
[super viewDidLoad]; // 1.添加自己的tabbar
MJTabBar *myTabBar = [[MJTabBar alloc] init];
myTabBar.delegate = self;
myTabBar.frame = self.tabBar.bounds;
[self.tabBar addSubview:myTabBar]; // 2.添加对应个数的按钮
for (int i = ; i < self.viewControllers.count; i++) {
NSString *name = [NSString stringWithFormat:@"TabBar%d", i + ];
NSString *selName = [NSString stringWithFormat:@"TabBar%dSel", i + ];
[myTabBar addTabButtonWithName:name selName:selName];
}
} /**
normal : 普通状态
highlighted : 高亮(用户长按的时候达到这个状态)
disable : enabled = NO
selected : selected = YES
*/ #pragma mark - MJTabBar的代理方法
- (void)tabBar:(MJTabBar *)tabBar didSelectButtonFrom:(int)from to:(int)to
{
// 选中最新的控制器
self.selectedIndex = to;
}
@end

最终运行后的效果:

源代码下载:点击下载

iOS 网易彩票-2框架搭建-代码重构的更多相关文章

  1. iOS 网易彩票-1框架搭建

    仿网易彩票,最终要做成的效果如下: 一.分层搭建 1.新建一个项目,Lottery.只支持7.1以上坚屏. 2.将素材全部图片全部拉到相应的文件夹里. 3.选中Lottery--右键Show in F ...

  2. iOS 网易彩票-6设置模块三(常用小功能)

    该篇文章中,用到很多iOS开发过程中常用的小功能,当前只是将这些功能集成到网易彩票的设置中.iOS-常用小功能介绍,请参考我的另一篇文章: iOS 常用小功能 总结:http://www.cnblog ...

  3. iOS 网易彩票-4设置模块一

    概述 基本上,每一款APP都有相应的设置模块.怎么设置才能更灵活和通用呢,这也是大家一直思考的.下面说说在网易彩票中,设置模块的设置思想. 基本上有三种方案: static cell(呆板,完全没有动 ...

  4. iOS 网易彩票-5设置模块二

    产品推荐 产品推荐使用的是UICollectionView控件,UICollectionView 和 UICollectionViewController 类是iOS6 新引进的API,用于展示集合视 ...

  5. iOS 网易彩票-3常见设置

    Navigation导航设置 为了统一管理导航控制器,需要自定义导航控制器MJNavigationController,继承于UINavigationController.分别设置5个Navigati ...

  6. Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介

    约定 还记得上版本的第二十四篇的约定嘛?现在出来履行啦~ 为什么要重制? 之前写的专栏都是按照心情写的,在最初的时候笔者什么都不懂,而且文章的发布是按照很随性的一个顺序.结果就是说,大家都看完了,都还 ...

  7. 再造轮子之网易彩票-第一季(IOS 篇 by sixleaves)

    前言 在网上看了别人做的模仿网易彩票的项目, 于是也跟着用自己的想法做了一篇.写这篇博客的目的, 在于UI综合的一次小练习, 同时总结和串联其各个控件之间的应用.封装思想等.考虑到有人上不了githu ...

  8. iOS项目——基本框架搭建

    项目开发过程中,在完成iOS项目——项目开发环境搭建之后,我们首先需要考虑的就是我们的项目的整体框架与导航架构设计,然后在这个基础上考虑功能模块的完成. 一 导航架构设计 一款App的导航架构设计应该 ...

  9. iOS 从零到一搭建组件化项目框架

    随着公司业务需求的不断迭代发展,工程的代码量和业务逻辑也越来越多,原始的开发模式和架构已经无法满足我们的业务发展速度了,这时我们就需要将原始项目进行一次重构大手术了.这时我们应该很清晰这次手术的动刀口 ...

随机推荐

  1. jQuery的回调管理机制

    // 对option的一个缓存,避免每次都需要createOptions,option是创建Callback对象时的传入的参数// 每个option被存入optionsCache中类似于{memory ...

  2. 跟bWAPP学WEB安全(PHP代码)--SQL注入的一些技巧

    背景 模拟环境还是 bWAPP,只不过这个bWAPP的SQL注入有点多,一一写意义不大,在这边就利用这个环境来尝试一些SQL注入的技巧.并研究下PHP的防御代码. 普通的bWAPPSQL注入的简单介绍 ...

  3. Windows Server 2012升级R2过程中意外关闭恢复原系统方法

    2012升级R2过程中强制关闭了计算机,导致再次启动后蓝屏提示"BAD_SYSTEM_CONFIG_INFO".用2012安装盘进入尝试修复失败(安全模式什么的都不用想),进入命令 ...

  4. 网站测速、ping

    1.17ce 2. 360奇云测 3.http://ping.chinaz.com/ 效果图:

  5. Android图表开发——AChartEngine

    Android图表控件的开发 曾经开发过一个小程序,在Android电视机上面开发一个APP,用于显示一些统计图表的信息.最后找来找去基于Android Native开发有AChartEngine现成 ...

  6. mysql的sql优化

    https://dev.mysql.com/doc/refman/8.0/en/statement-optimization.html 8.2 Optimizing SQL Statements 8. ...

  7. Django---Mysql数据库链接

    Django链接Mysql数据库: 第一步:创建应用 python manage.py startapp index 第二步:将应用添加到配置里面 settings INSTALLED_APPS = ...

  8. pandas 中的DataFrame.where()使用

    pandas.DataFrame.where DataFrame.where(cond, other=nan, inplace=False, axis=None, level=None, try_ca ...

  9. UI自动化--PageObjects(页面对象)

    核心的核心:减少了重复代码的数量,减少变更涉及面:做到如果UI发生更改,则只需在一个位置应用此修复程序. PageObject:将页面作为一个对象,进行封装,包括元素定位,封装获取各元素.操作的方法: ...

  10. jquery选择器中的逗号

    $("span",this)等同于$(this).find('span') 中间逗号两个条件的并集