代码改变世界

ios中MKHorizMenu用法

2013-08-02 09:05  甘超波  阅读(1070)  评论(0编辑  收藏  举报
 下载地址  https://github.com/MugunthKumar/MKHorizMenuDemo
直接 加入MKHorizMenu目录即可
下载包地址 http://pan.baidu.com/share/link?shareid=2872269045&uk=923776187
//
// MyViewController.m // MyTest // // Created by zy on 13-8-1. // Copyright (c) 2013年 zy. All rights reserved. // #import "MyViewController.h" #import "JSContentView.h" @interface MyViewController (){ JSContentView *newView; UIView *contentview; } @property(nonatomic,retain)NSArray *mydata; //缓存view @property(nonatomic,retain)NSMutableDictionary *cacheDic; @end @implementation MyViewController - (void)viewDidLoad { [super viewDidLoad]; self.cacheDic=[NSMutableDictionary dictionary]; self.view.backgroundColor=[UIColor whiteColor]; self.mydata=@[@"语文",@"数学",@"英语"]; MKHorizMenu *Menu=[[MKHorizMenu alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 80)]; Menu.dataSource=self; Menu.itemSelectedDelegate=self; contentview=[[UIView alloc] initWithFrame:CGRectMake(0,90, 320, 300)];//内容view, [self.view addSubview:contentview]; [contentview release]; [self.view addSubview:Menu]; [self horizMenu:Menu itemSelectedAtIndex:0];//默认是第一个选中 [Menu reloadData]; [Menu release]; } #pragma mark -MKHorizMenu DataSource - (UIColor*) backgroundColorForMenu:(MKHorizMenu*) tabView{ return [UIColor purpleColor]; } - (int) numberOfItemsForMenu:(MKHorizMenu*) tabView{ return 3; } - (NSString*) horizMenu:(MKHorizMenu*) horizMenu titleForItemAtIndex:(NSUInteger) index{ return self.mydata[index]; } #pragma mark -MK Delegate - (void)horizMenu:(MKHorizMenu*) horizMenu itemSelectedAtIndex:(NSUInteger) index{ for (UIView *child in contentview.subviews) {//先移除所有的view. [child removeFromSuperview]; } NSString *tempstr=self.mydata[index]; if(![self.cacheDic objectForKey:tempstr]){ switch (index) { case 0: { newView=[[JSContentView alloc] initWithFrame:contentview.bounds requestSEL:@selector(Requestdeta) aDelegate:self]; [contentview addSubview:newView]; [self.cacheDic setObject:newView forKey:tempstr];//放入缓存中 [newView release]; } break; case 1: { UIView *view=[[UIView alloc] initWithFrame:contentview.bounds]; view.backgroundColor=[UIColor redColor]; [contentview addSubview:view]; [self.cacheDic setObject:view forKey:tempstr]; [view release]; } break; case 2: { UIView *view=[[UIView alloc] initWithFrame:contentview.bounds]; view.backgroundColor=[UIColor yellowColor]; [contentview addSubview:view]; [self.cacheDic setObject:view forKey:tempstr]; [view release]; } break; default: break; } } else{ UIView *view=[self.cacheDic objectForKey:tempstr]; [contentview addSubview:view]; } } -(void)Requestdeta{ NSString *url=[NSString stringWithFormat:@"http://61.177.61.252/szzssw/taxCommon.action?code=1001&pagecode=%zi&menucode=3300000000",newView.Pagecode==0?1:newView.Pagecode]; //请求数据,重新刷新数据 [[JSNetWord ShareNetwork] NetWorkWithConnctId:100 body:url PostBody:nil aDelegate:self]; //先从缓存中读取 NSString *cache=[self readApiCacheFileName:@"1.txt"]; if (cache.length>0 &&newView.Pagecode==1) { [self NetWorkWithConnectId:100 aBackString:cache withState:0]; } } -(void)NetWorkWithConnectId:(int)connectid aBackString:(NSString *)backString withState:(int)state{ if(connectid==100){ if (newView.Pagecode<=1 && state==1) {//是下拉 newView.tableview.pullTableIsRefreshing=NO; } if (newView.Pagecode>1) {//上拉 newView.tableview.pullTableIsLoadingMore=NO; } if (newView.Pagecode==1) {//下拉 保存数据 [self saveApiCacheFileName:@"1.txt" textContent:backString Append:NO]; } NSDictionary *arr= [backString JSONValue]; if (newView.Pagecode==1 &&newView.mydata.count>0) { [newView.mydata removeAllObjects];//下拉 只显示20 ,上拉 累加 } [newView.mydata addObjectsFromArray:arr[@"content"]]; [newView.tableview reloadData]; } } - (void)dealloc { [_mydata release]; [_cacheDic release]; [super dealloc]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end

第一种方式   修改 MKHorizMenu.m文件

-(void) reloadData
{
   NSArray *viewsToRemove = [self subviews];
    for (UIView *v in viewsToRemove) {
        [v removeFromSuperview];
    }
    self.itemCount = [dataSource numberOfItemsForMenu:self];//调用代理的方法
    
           float btnWidth =  self.bounds.size.width / self.itemCount;//得到宽度
            
            int tag = kButtonBaseTag;
            
            self.backgroundColor = [dataSource backgroundColorForMenu:self];
            //    self.selectedImage = [dataSource selectedItemImageForMenu:self]; 去掉代理这个方法
            
            CGRect imgRec,btnRec,hRec;
            CGRectDivide(self.bounds, &imgRec, &btnRec, 2, CGRectMaxYEdge);
            
            for(int i = 0 ; i < self.itemCount; i ++)//进行遍历
            {
                CGRectDivide(btnRec, &hRec, &btnRec, btnWidth, CGRectMinXEdge);
                NSString *title = [dataSource horizMenu:self titleForItemAtIndex:i];
                UIButton *menuBtn = [UIButton ButtonWithImageName:nil hImageName:nil frame:CGRectZero title:title titleColor:[UIColor blackColor]
                                                             font:[UIFont boldSystemFontOfSize:15] target:self action:@selector(buttonTapped:)];
                //        [menuBtn setBackgroundImage:self.selectedImage forState:UIControlStateSelected];
                [menuBtn setTitleColor:rgb(109, 209, 62) forState:UIControlStateSelected];
                
                menuBtn.tag = tag++;
                [self addSubview:menuBtn];
 
                if (i == 0) {//按钮之间保持2个间距
                    hRec = UIEdgeInsetsInsetRect(hRec, UIEdgeInsetsMake(0, 0, 0, 1));
                }else if (i == self.itemCount-1){
                    hRec = UIEdgeInsetsInsetRect(hRec, UIEdgeInsetsMake(0, 1, 0, 0));
                }else{
                    hRec = UIEdgeInsetsInsetRect(hRec, UIEdgeInsetsMake(0, 1, 0, 1));
                }
                menuBtn.frame = hRec;
                

                if (i != 0 && i != self.itemCount) {//在每个按钮加 “|”
                    hRec = CGRectMake(hRec.origin.x, hRec.origin.y,2 , hRec.size.height);
                    hRec = UIEdgeInsetsInsetRect(hRec, UIEdgeInsetsMake(10, 0, 10, 0));
                    UIImageView *verImgView = [UIImageView ImageViewImageName:nil frame:hRec];
                    verImgView.image = [UIImage ImageWithColor:rgb(213, 214, 218) frame:verImgView.bounds];
                    [self addSubview:verImgView];
                }
            }
            //这个在按钮中加背景
            UIImageView *btnBottnImg = [UIImageView ImageViewImageName:nil frame:imgRec];
            btnBottnImg.image = [UIImage ImageWithColor:rgb(213, 214, 218) frame:btnBottnImg.bounds];
            [self addSubview:btnBottnImg];
            
            //移动背景
            moveImageView = [UIImageView ImageViewImageName:nil frame:UIEdgeInsetsInsetRect(imgRec, UIEdgeInsetsMake(0, 0, 0, (self.itemCount - 1) * btnWidth))];
            moveImageView.image = [UIImage ImageWithColor:rgb(109, 209, 62) frame:moveImageView.bounds];
            
            [self addSubview:moveImageView];

        }
            break;
    }
    
        
    [self layoutSubviews];

}


-(void) buttonTapped:(id) sender//按钮点击事件
{
    UIButton *button = (UIButton*) sender;
    
    for(int i = 0; i < self.itemCount; i++)
    {
        UIButton *thisButton = (UIButton*) [self viewWithTag:i + kButtonBaseTag];
        if(i + kButtonBaseTag == button.tag)
            thisButton.selected = YES;
        else
            thisButton.selected = NO;
    }
    CGRect mRec = moveImageView.frame;
    moveImageView.frame = CGRectMake(button.frame.origin.x,mRec.origin.y, button.frame.size.width, mRec.size.height);//移动背景
    
    [self.itemSelectedDelegate horizMenu:self itemSelectedAtIndex:button.tag - kButtonBaseTag];
}

 

 

第二种方式 修改 MKHorizMenu.m文件

//
//  MKHorizMenu.m
//  MKHorizMenuDemo
//  Created by Mugunth on 09/05/11.
//  Copyright 2011 Steinlogic. All rights reserved.
//  Permission granted to do anything, commercial/non-commercial with this file apart from removing the line/URL above
//  Read my blog post at http://mk.sg/8h on how to use this code

//  As a side note on using this code, you might consider giving some credit to me by
//    1) linking my website from your app's website 
//    2) or crediting me inside the app's credits page 
//    3) or a tweet mentioning @mugunthkumar
//    4) A paypal donation to mugunth.kumar@gmail.com
//
//  A note on redistribution
//    While I'm ok with modifications to this source code, 
//    if you are re-publishing after editing, please retain the above copyright notices

#import "MKHorizMenu.h"
#define kButtonBaseTag 10000
#define kLeftOffset 10

@implementation MKHorizMenu

@synthesize titles = _titles;
@synthesize selectedImage = _selectedImage;

@synthesize itemSelectedDelegate;
@synthesize dataSource;
@synthesize itemCount = _itemCount;

-(void) awakeFromNib
{
    self.bounces = YES;
    self.scrollEnabled = YES;
    self.alwaysBounceHorizontal = YES;
    self.alwaysBounceVertical = NO;
    self.showsHorizontalScrollIndicator = NO;
    self.showsVerticalScrollIndicator = NO;
    [self reloadData];
}
     
-(void) reloadData
{
    NSArray *viewsToRemove = [self subviews];
    for (UIView *v in viewsToRemove) {
        [v removeFromSuperview];
    }
    
    self.itemCount = [dataSource numberOfItemsForMenu:self];
    self.backgroundColor = [dataSource backgroundColorForMenu:self];
    //self.selectedImage = [dataSource selectedItemImageForMenu:self]; 去掉背景色

    UIFont *buttonFont = [UIFont boldSystemFontOfSize:15];
    int buttonPadding = 25;
    
    int tag = kButtonBaseTag;
//    int xPos = kLeftOffset;
  //fix 增加 自定义宽度和高度
    int width=self.bounds.size.width/self.itemCount;
    int height=self.bounds.size.height;
    //
    for(int i = 0 ; i < self.itemCount; i ++)
    {
        NSString *title = [dataSource horizMenu:self titleForItemAtIndex:i];
        UIButton *customButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [customButton setTitle:title forState:UIControlStateNormal];
        customButton.titleLabel.font = buttonFont;
        
        //[customButton setBackgroundImage:self.selectedImage forState:UIControlStateSelected];//去掉button的背景
        
        customButton.tag = tag++;
        [customButton addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
        
        int buttonWidth = [title sizeWithFont:customButton.titleLabel.font
                            constrainedToSize:CGSizeMake(150, 28) 
                                lineBreakMode:UILineBreakModeClip].width;
        customButton.frame=CGRectMake(i*width, 0, width, height);//设置uttton通的宽度和高度
//        customButton.frame = CGRectMake(xPos, 7, buttonWidth + buttonPadding, 28);
//        xPos += buttonWidth;
//        xPos += buttonPadding;
        [self addSubview:customButton];
    }
    
    // bretdabaker: added right padding to contentSize
//    xPos += kLeftOffset;
    
   // self.contentSize = CGSizeMake(xPos, 41);
    [self layoutSubviews];  
}


-(void) setSelectedIndex:(int) index animated:(BOOL) animated
{
    UIButton *thisButton = (UIButton*) [self viewWithTag:index + kButtonBaseTag];    
    thisButton.selected = YES;
    [self setContentOffset:CGPointMake(thisButton.frame.origin.x - kLeftOffset, 0) animated:animated];
    [self.itemSelectedDelegate horizMenu:self itemSelectedAtIndex:index];
}

-(void) buttonTapped:(id) sender
{
    UIButton *button = (UIButton*) sender;
    
    for(int i = 0; i < self.itemCount; i++)
    {
        UIButton *thisButton = (UIButton*) [self viewWithTag:i + kButtonBaseTag];
        if(i + kButtonBaseTag == button.tag)
            thisButton.selected = YES;
        else
            thisButton.selected = NO;
    }
    
    [self.itemSelectedDelegate horizMenu:self itemSelectedAtIndex:button.tag - kButtonBaseTag];
}


- (void)dealloc
{
    [_selectedImage release];
    _selectedImage = nil;
    [_titles release];
    _titles = nil;
    
    [super dealloc];
}

@end

分析

MKHorizMenu.m文件
#import "MKHorizMenu.h"
#define kButtonBaseTag 10000
#define kLeftOffset 10

@implementation MKHorizMenu

@synthesize titles = _titles;
@synthesize selectedImage = _selectedImage;

@synthesize itemSelectedDelegate;
@synthesize dataSource;
@synthesize itemCount = _itemCount;

-(void) awakeFromNib
{
    self.bounces = YES;
    self.scrollEnabled = YES;
    self.alwaysBounceHorizontal = YES;
    self.alwaysBounceVertical = NO;
    self.showsHorizontalScrollIndicator = NO;
    self.showsVerticalScrollIndicator = NO;
    [self reloadData];
}
     
-(void) reloadData
{
    NSArray *viewsToRemove = [self subviews];
    for (UIView *v in viewsToRemove) {
        [v removeFromSuperview];
    }
    
    self.itemCount = [dataSource numberOfItemsForMenu:self];//得到多少按钮
    self.backgroundColor = [dataSource backgroundColorForMenu:self];//得到背景色
    self.selectedImage = [dataSource selectedItemImageForMenu:self];//得到背景图片

    UIFont *buttonFont = [UIFont boldSystemFontOfSize:15];
    int buttonPadding = 25;//间距
    
    int tag = kButtonBaseTag;    
    int xPos = kLeftOffset;

    for(int i = 0 ; i < self.itemCount; i ++)
    {
        NSString *title = [dataSource horizMenu:self titleForItemAtIndex:i];//得到标题
        UIButton *customButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [customButton setTitle:title forState:UIControlStateNormal];
        customButton.titleLabel.font = buttonFont;//设置字体
        
        [customButton setBackgroundImage:self.selectedImage forState:UIControlStateSelected];//设置图片
        
        customButton.tag = tag++;//设置tag
        [customButton addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];//添加事件
        
        int buttonWidth = [title sizeWithFont:customButton.titleLabel.font
                            constrainedToSize:CGSizeMake(150, 28) 
                                lineBreakMode:UILineBreakModeClip].width;
        
        customButton.frame = CGRectMake(xPos, 7, buttonWidth + buttonPadding, 28);//设置每个button的位置
        xPos += buttonWidth;
        xPos += buttonPadding;
        [self addSubview:customButton];        
    }
    
    // bretdabaker: added right padding to contentSize
    xPos += kLeftOffset;
    
    self.contentSize = CGSizeMake(xPos, 41);    
    [self layoutSubviews];  
}


-(void) setSelectedIndex:(int) index animated:(BOOL) animated//点击时触发事件。
{
    UIButton *thisButton = (UIButton*) [self viewWithTag:index + kButtonBaseTag];    
    thisButton.selected = YES;
    [self setContentOffset:CGPointMake(thisButton.frame.origin.x - kLeftOffset, 0) animated:animated];
    [self.itemSelectedDelegate horizMenu:self itemSelectedAtIndex:index];//事件
}

-(void) buttonTapped:(id) sender
{
    UIButton *button = (UIButton*) sender;
    
    for(int i = 0; i < self.itemCount; i++)
    {
        UIButton *thisButton = (UIButton*) [self viewWithTag:i + kButtonBaseTag];
        if(i + kButtonBaseTag == button.tag)
            thisButton.selected = YES;
        else
            thisButton.selected = NO;
    }
    
    [self.itemSelectedDelegate horizMenu:self itemSelectedAtIndex:button.tag - kButtonBaseTag];//点击事件
}


- (void)dealloc
{
    [_selectedImage release];
    _selectedImage = nil;
    [_titles release];
    _titles = nil;
    
    [super dealloc];
}

@end