IOS中UITableview中封装九宫格
第一步引入SecondNav目录即可
第二步引入头文件
#import "DIYTableView.h"
#import "invoiceInfo.h"
实现协议
DIYButtonDelegate
- (void)viewDidLoad
{
[super viewDidLoad];
NSMutableArray *mydata=[NSMutableArrayarray];
NSString *path=[[NSBundlemainBundle] pathForResource:@"Pad_menu_level"ofType:@"json"];
NSError * error=nil;
NSString *content=[NSStringstringWithContentsOfFile:path encoding:NSUTF8StringEncodingerror:&error];
if (error) {
NSLog(@"读取%@错误",path);
return;
}
NSArray *ContentArrary=[content JSONValue];
for (NSDictionary *dic in ContentArrary) {
InvoiceInfo *info=[InvoiceInfoInvoice:dic];
[mydata addObject:info];
}
CGFloat h=tpRec.size.height-KBottom;
CGRectDivide(tpRec, &imgRec, &tpRec, h, CGRectMinYEdge);
CGRect navRect=UIEdgeInsetsInsetRect(imgRec, UIEdgeInsetsMake(5, 5, 5, 5));
//二级导航
DIYTableView *NavSecond=[[DIYTableViewalloc] initWithFrame:navRect delegate:self];
[self.view addSubview: NavSecond];
NavSecond.aData=mydata;
[NavSecond release];
} //实现代理方法
-(void)DiyButtonClick:(DIYButton *) btn{
NSLog(@"title-->%@",btn.titleLabel.text);
}
下载地址 http://pan.baidu.com/share/link?shareid=1824940819&uk=923776187
以下参照代码
封装model
#import <Foundation/Foundation.h> @interface InvoiceInfo : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *imagUrl;
@property(nonatomic,copy)NSString *iPad_ctrls; +(id)Invoice:(NSDictionary *)info;
@end #import "InvoiceInfo.h" @implementation InvoiceInfo
+(id)Invoice:(NSDictionary *)info{
InvoiceInfo *invoice=[[[InvoiceInfo alloc] init] autorelease];
invoice.name=info[@"name"];
invoice.imagUrl=info[@"iPad_image"];
invoice.iPad_ctrls=info[@"iPad_ctrls"];
return invoice;
} - (void)dealloc
{
[_name release];
[_imagUrl release];
[_iPad_ctrls release];
[super dealloc];
} @end
自定义button
#import <UIKit/UIKit.h>
#define KFont 15 @interface DIYButton : UIButton @property(nonatomic,copy)NSString *ctrlName;
@end #import "DIYButton.h"
#define KImageHeight 0.6
#define KPadding 0.1
#define KTitleHeight (1-KImageHeight-2*KPadding) @implementation DIYButton - (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
//设置文字
[self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
self.titleLabel.textAlignment=NSTextAlignmentCenter;
self.titleLabel.font=[UIFont systemFontOfSize:KFont];
//设置图片
self.imageView.contentMode=UIViewContentModeScaleAspectFit;
self.adjustsImageWhenHighlighted=NO;
}
return self;
} -(CGRect)titleRectForContentRect:(CGRect)contentRect{
int width =contentRect.size.width;
int height=contentRect.size.height;
return CGRectMake(, height*(KPadding+KImageHeight), width, height*KTitleHeight);
} -(CGRect )imageRectForContentRect:(CGRect)contentRect{
int width =contentRect.size.width;
int height=contentRect.size.height;
return CGRectMake(, height*KPadding, width, height*KImageHeight); } - (void)dealloc
{
[_ctrlName release];
[super dealloc];
} @en
自定义cell
#import <UIKit/UIKit.h>
#import "InvoiceInfo.h"
#import "DIYButton.h"
#define KCount 8
#define KHeight 100
#define KMinTag 10 @protocol DIYButtonDelegate; @interface DIYCell : UITableViewCell
@property(nonatomic,retain)NSArray *data;
@property(nonatomic,assign)id<DIYButtonDelegate> diyDelegate;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier; @end @protocol DIYButtonDelegate <NSObject> -(void)DiyButtonClick:(DIYButton *) btn; @end #import "DIYCell.h" #define KPadding 25 @implementation DIYCell - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier;
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
for (int i=; i<KCount; i++) {
DIYButton *btn=[[DIYButton alloc] initWithFrame:CGRectZero];
btn.tag=KMinTag+i;
[self.contentView addSubview:btn];
[btn addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
}
}
return self;
} -(void)click:(DIYButton *)btn{
if (self.diyDelegate &&[self.diyDelegate respondsToSelector:@selector(DiyButtonClick:)]) {
[self.diyDelegate DiyButtonClick:btn];
}
} -(void)setData:(NSArray *)data{
if (_data!=data) {
[_data release];
_data=[data retain];
int count =self.data.count;
for (int i=; i<KCount; i++) {
DIYButton *btn=(DIYButton *)[self.contentView viewWithTag:(i+KMinTag)];
if (i<count) {
btn.hidden=NO;
InvoiceInfo *sp=data[i];
[btn setTitle:sp.name forState:UIControlStateNormal];
[btn setImage:[UIImage imageNamed:sp.imagUrl] forState:UIControlStateNormal];
btn.ctrlName=sp.iPad_ctrls;
}
else{
btn.hidden=YES;
}
}
}
} -(void)layoutSubviews{
[super layoutSubviews]; int width=self.contentView.bounds.size.width/KCount;
CGFloat height=self.contentView.bounds.size.height;
//button事件宽度
CGFloat btnWidth=width-KPadding;
CGFloat btnheight=height-KPadding;
CGFloat centWidth=width*0.5f;
for (UIView *child in self.contentView.subviews) {
if ([child isKindOfClass:[UIButton class]]) {
int tag=child.tag-KMinTag;
if (tag>= &&tag<KCount) {
child.bounds=CGRectMake(, , btnWidth, btnheight); child.center=CGPointMake(tag*width+ centWidth, height*0.5f);//这一步很关键, 先平分cell的宽度,让后button在剧中 }
}
}
} @end
封装tableview
#import <UIKit/UIKit.h>
#import "DIYCell.h" @interface DIYTableView : UIView<UITableViewDataSource,UITableViewDelegate>
@property(nonatomic,readonly)UITableView *tableview;
@property(nonatomic,retain)NSMutableArray *aData;
@property(nonatomic,assign)id tableDelegate;
- (id)initWithFrame:(CGRect)frame delegate:(id)adelegate;
@end #import "DIYTableView.h"
#import "DIYCell.h" @implementation DIYTableView - (id)initWithFrame:(CGRect)frame delegate:(id)adelegate;
{
self = [super initWithFrame:frame];
if (self) {
_tableview=[[UITableView alloc] initWithFrame:self.bounds style:UITableViewStylePlain];
[self addSubview:_tableview];
_tableview.separatorStyle=UITableViewCellSeparatorStyleNone;
_tableview.backgroundColor=[UIColor clearColor]; _tableview.delegate=self;
_tableview.dataSource=self;
self.tableDelegate=adelegate;
[_tableview release];
}
return self;
} #pragma mark -tableview data source
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return ;
} -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
int count=self.aData.count/KCount;
if (!self.aData.count%KCount==) {
count++;
}
return count;
} -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellIdentiry=@"DIYTableView";
DIYCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentiry];
if (cell==nil) {
cell=[[[DIYCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentiry] autorelease];
}
cell.diyDelegate=self.tableDelegate; // 设置cell的背景色
UIView *bg = [[[UIView alloc] init] autorelease];
bg.backgroundColor=[UIColor whiteColor];
cell.backgroundView = bg; // 选中的背景
UIView *selectdBg = [[[UIView alloc] init] autorelease];
selectdBg.backgroundColor = [UIColor whiteColor];
cell.selectedBackgroundView = selectdBg; //起始数据
int location=indexPath.row*KCount;
int length=KCount;
if (location+length>self.aData.count) {
length=self.aData.count-location;
}
NSArray *temparr=[self.aData subarrayWithRange:NSMakeRange(location, length)];
cell.data=temparr;
return cell;
} #pragma mark -tableview delegate
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return ;
} @end
viewcontroller用法 必须实现
DIYButtonDelegate协议
NSMutableArray *mydata=[NSMutableArray array];
NSString *path=[[NSBundle mainBundle] pathForResource:@"Pad_menu_level" ofType:@"json"];
NSError * error=nil;
NSString *content=[NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
if (error) {
NSLog(@"读取%@错误",path);
return;
} NSArray *ContentArrary=[content JSONValue];
for (NSDictionary *dic in ContentArrary) {
InvoiceInfo *info=[InvoiceInfo Invoice:dic];
[mydata addObject:info];
}
CGFloat h=tpRec.size.height-KBottom;
CGRectDivide(tpRec, &imgRec, &tpRec, h, CGRectMinYEdge); CGRect navRect=UIEdgeInsetsInsetRect(imgRec, UIEdgeInsetsMake(, , , ));
//二级导航
DIYTableView *NavSecond=[[DIYTableView alloc] initWithFrame:navRect delegate:self];
[self.view addSubview: NavSecond];
NavSecond.aData=mydata;
[NavSecond release];
-(void)DiyButtonClick:(DIYButton *) btn{
NSLog(@"第二导航__%@__%@",btn.titleLabel.text,btn.ctrlName);
[selfpushNavVc:btn.ctrlName];
}
IOS中UITableview中封装九宫格的更多相关文章
- iOS之UITableView中的cell因为重用机制导致新的cell的数据出现重复或者错乱
UITableView中的cell可以有很多,一般会通过重用cell来达到节省内存的目的:通过为每个cell指定一个重用标识符(reuseIdentifier),即指定了单元格的种类,当cell滚 ...
- iOS解决UITableView中Cell重用带来的问题
tableView的常规配置,当超出一屏的cell就会标上可重用的标识出列到可重用缓存池中,后面再根据可重用标识来到的可重的cell就会和前面显示同样内容. - (UITableViewCell *) ...
- ios 自定义UITableView中分组的标题sectionview
//Section的标题栏高度 -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)sec ...
- ios 更改UITableview中Section的字体颜色
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UILabel *c ...
- iOS设置UITableView中Cell被默认选中后怎么触发didselect事件
//默认选中某个cell [self.searchResultTV selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] a ...
- ios中封装九宫格的使用(二级导航)
效果图 一般用于导航功能 第一步下载http://pan.baidu.com/share/link?shareid=1824940819&uk=923776187 第二步 把下图内容放在你的x ...
- iOS中UITableView的cell点击事件不触发didSelectRowAtIndexPath(汇总)
iOS中UITableView的cell点击事件不触发didSelectRowAtIndexPath 首先分析有几种原因,以及相应的解决方法 1.UITableViewCell的userInterac ...
- IOS开发中UITableView(表视图)的滚动优化及自定义Cell
IOS开发中UITableView(表视图)的滚动优化及自定义Cell IOS 开发中UITableView是非常常用的一个控件,我们平时在手机上看到的联系人列表,微信好友列表等都是通过UITable ...
- ios UITableView中Cell重用机制导致内容重复解决方法
UITableView继承自UIScrollview,是苹果为我们封装好的一个基于scroll的控件.上面主要是一个个的 UITableViewCell,可以让UITableViewCell响应一些点 ...
随机推荐
- [leetcode]Word Break II @ Python
原题地址:https://oj.leetcode.com/problems/word-break-ii/ 题意: Given a string s and a dictionary of words ...
- pytorch之dataloader深入剖析
PyTorch学习笔记(6)——DataLoader源代码剖析 - dataloader本质是一个可迭代对象,使用iter()访问,不能使用next()访问: - 使用iter(dataloader) ...
- NodeJS错误-throw er; // Unhandled 'error' event
第一眼看以为Express版本出现问题,因为本地已经存在另外一个运行的Node项目,端口重复,修改一下端口号即可,错误提示如下: events.js:85 throw er; // Unhandled ...
- Reverse Words in a String leetcode java
题目: Given an input string, reverse the string word by word. For example, Given s = "the sky is ...
- Spiral Matrix II leetcode java
题目: Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. ...
- Unique Paths II leetcode java
题目: Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. H ...
- 三种简洁的经典高效的DIV+CSS制作的Tab导航简析
在网页中应用选项卡可以使网页显得更紧凑,结合AJAX技术可以使页面在有限的空间内展现更多的内容.本文主要介绍几种简洁的选项卡效果的实现(不涉及滑动门和AJAX),附有实例,无图片,兼容性较好,方便大家 ...
- Android 混合式开发AppCan介绍
Android程序员开发已从最早的异常火热到现在已经逐渐趋向稳定,目前企业针对Android开发工程师的要求要求已逐步提高,现在想从众多的面试者中脱颖而出,必须打好坚实的代码基础. 今天为大家介绍一款 ...
- Android -- ConditionVariable
线程操作经常用到wait和notify,用起来稍显繁琐,而Android给我们封装好了一个ConditionVariable类,用于线程同步.提供了三个方法block().open().close() ...
- extjs_08_界面布局
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWRhbV93enM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...