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