【深入浅出IOS开发】彩票-代理实现子Controller的切换

知识点一览:

①TabBarController中通过设置selectedIndex来完成子控件的切换

②自定义UIButon,重写 setHighLighted可以在多次点击按钮时候不会重新设置高亮

③重写UITabBar的layOutSubViews可以设置控件的内部的元素的布局。

④UIControllEventTouchDown 按钮只要点击就触发事件。

重点:

⑤代理实现子Controller的切换



代码实现:

①MRBUtton:

#import "MRButton.h"

@implementation MRButton

- (void)setHighlighted:(BOOL)highlighted
{
    //[super setHighlighted:YES];
}
@end


②MRTabBar

----------------------------------------------MRTabBar.h--------------------------------------------

#import <UIKit/UIKit.h>
@class MRTabBar;
//①设置协议的具体内容
@protocol MRTabBarDelegate <NSObject>

- (void)tabBar:(MRTabBar*)tabBar didSelectItemFrom:(int)from to:(int)to;

@end

@interface MRTabBar : UITabBar
@property (nonatomic,weak) UIButton *button;
//②甲方在协议上签名
@property (nonatomic,weak) id<MRTabBarDelegate> delegate;
@end

------------------------------------------------MRTabBar.m--------------------------------------------

#import "MRTabBar.h"
#import "MRButton.h"
@implementation MRTabBar
- (instancetype)initWithFrame:(CGRect)frame
{
  // [super initWithFrame:frame];
    
    if (self = [super initWithFrame:frame]) {
        for (int i = 0; i < 5; i++) {
            //1.创建一个按钮
            MRButton *button = [MRButton buttonWithType:UIButtonTypeCustom];
            //2.设置按钮正常显示的图片
            NSString *strImage = [NSString stringWithFormat:@"TabBar%d",i+1];
            UIImage *image = [UIImage imageNamed:strImage];
            [button setImage:image forState:UIControlStateNormal];
            //3.设置按钮被选中的时候显示的图片
            NSString *strImageSel = [NSString stringWithFormat:@"TabBar%dSel",i+1];
            UIImage *imagehighLSel = [UIImage imageNamed:strImageSel];
            [button setImage:imagehighLSel forState:UIControlStateSelected];
            //4.设置按钮的frame
            
            CGFloat width = self.frame.size.width*0.2;
            CGFloat height = self.frame.size.height;
            CGFloat xPos = i*width;
            CGFloat yPos = 0;
            
            [button setFrame:CGRectMake(xPos, yPos, width, height)];
            //5.设置按钮的Target
            [button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchDown];
            //6.设置按钮的tag
            [button setTag:i];
            //button.adjustsImageWhenDisabled = YES;
            //7.添加按钮到Tabbar
            [self addSubview:button];
            
            if (i == 0) {
                [self click:button];
            }
        }
    }
    
    return self;
}

-(void)click:(UIButton*)button
{
    //③告诉乙方协议中要求做的事情
    if ([self.delegate respondsToSelector:@selector(tabBar:didSelectItemFrom:to:)]) {
        [self.delegate tabBar:self didSelectItemFrom:self.button.tag to:button.tag];
    }
    //1.设置当前按钮不被选中
    self.button.selected =NO;
    //2.新点击的按钮被选中
    button.selected = YES;
    
    //3.把新点击的按钮设置为当前按钮
    self.button = button;
    //4.切换子控制器
    //self.selectedIndex = button.tag;
    //self.button.tag = button.tag;
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

@end

MRTabBarViewController.m

#import "MRTabBarViewController.h"
#import "MRButton.h"
#import "MRTabBar.h"

@interface MRTabBarViewController ()<MRTabBarDelegate>//④乙方拿到协议
@property (nonatomic,weak) UIButton* button;
@end

@implementation MRTabBarViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    //1.清除原有的TabBar
    [self.tabBar removeFromSuperview];
    
    //2.生成一个新的TabBar
    MRTabBar *mrTabBar = [[MRTabBar alloc]initWithFrame:self.tabBar.frame];
    [mrTabBar setBackgroundColor:[UIColor redColor]];
    
    //⑤表示接受甲方TabBar的协议,乙方签名
    mrTabBar.delegate = self;
    //3.将Tabbar添加到View中
    [self.view addSubview:mrTabBar];
   // self.selectedIndex =mrTabBar.button.tag;
   
    
}
//⑥实现TabBar的协议中的方法
- (void)tabBar:(MRTabBar*)tabBar didSelectItemFrom:(int)from to:(int)to
{
    self.selectedIndex = to;
}
@end


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值