zoukankan      html  css  js  c++  java
  • iOS 网易*-2框架搭建-代码重构

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

    思路:

    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=0; i<count; i++) {
            MJTabBarButton *button=self.subviews[i];
            button.tag=i;
            
            //设置frame
            CGFloat buttonY=0;
            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 = 0; i<self.viewControllers.count; i++) {
            NSString *name=[NSString stringWithFormat:@"TabBar%d",i+1];
            NSString *selName=[NSString stringWithFormat:@"TabBar%dSel",i+1];
            [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==1) {
            [self buttonClick:button];
        }
    }
    
    //该方法通常是设置控件的尺寸,initWithFrame负责创建控件,initWithFrame下的frame是没有值的。
    -(void)layoutSubviews
    {
        [super layoutSubviews];
        NSUInteger count=self.subviews.count;
        for (NSUInteger i=0; i<count; i++) {
            MJTabBarButton *button=self.subviews[i];
            button.tag=i;
            
            //设置frame
            CGFloat buttonY=0;
            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 = 0; i < self.viewControllers.count; i++) {
            NSString *name = [NSString stringWithFormat:@"TabBar%d", i + 1];
            NSString *selName = [NSString stringWithFormat:@"TabBar%dSel", i + 1];
            [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

    最终运行后的效果:

     源代码下载:点击下载

  • 相关阅读:
    jQuery插件开发——全屏切换插件
    原生JS实现全屏切换以及导航栏滑动隐藏及显示——修改
    CSS 3学习——animation动画
    CSS 3学习——transition 过渡
    CSS 3 学习——transform 3D转换渲染
    CSS 3学习——transform 2D转换
    消息过滤
    jms消息组成
    vim常用命令整理
    知识碎片
  • 原文地址:https://www.cnblogs.com/jys509/p/4772076.html
Copyright © 2011-2022 走看看