下载地址 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