1.将控件进行九空格排列的算法
接口部分
@interface ViewController ()
//用来保存所有应用的数据
@property(nonatomic,strong)NSArray * apps;
@end
实现部分
@implementation ViewController
//懒加载数据
-(NSArray *)apps{
if (_apps==nil) {
//加载数据
//获取plist文件路径
NSString *path=[[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil];
//获取plist文件资源
NSArray *dataArray=[NSArray arrayWithContentsOfFile:path];
//返回数组
_apps=dataArray;
return _apps;
}else{
return _apps;
}
}
- (void)viewDidLoad {
[super viewDidLoad];
int columns=3;
//拿屏幕宽度
CGFloat viewWidth=self.view.frame.size.width;
CGFloat appW=75;
CGFloat appH=75;
CGFloat marginTop=50;
CGFloat marginX=(viewWidth-columns*appW)/(columns+1);
CGFloat marginY= marginX;
for (int i=0; i<self.apps.count; i++) {
NSLog(@"---");
// 创建单个应用的uiview
UIView *appview=[[UIView alloc]init];
appview.backgroundColor=[UIColor blueColor];
//设置view的属性
//设置每个但与昂个所在的列的索引
int colidx=i%columns;
//设置每个但与昂个所在的行的索引
int rowidx=i/columns;
CGFloat appX=marginX+colidx*(appW+marginX);
CGFloat appY=marginTop+rowidx*(appH+marginY);
appview.frame=CGRectMake(appX, appY, appW, appH);
//kong将viewd加到控制器管理的view
[self.view addSubview:appview];
}
}
@end
2.将二级控件放入一级控件中(九宫格中添加控件)
接口部分
@interface ViewController ()
//用来保存所有应用的数据
@property(nonatomic,strong)NSArray * apps;
@end
实现部分
@implementation ViewController
//懒加载数据
-(NSArray *)apps{
if (_apps==nil) {
//加载数据
//获取plist文件路径
NSString *path=[[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil];
//获取plist文件资源
NSArray *dataArray=[NSArray arrayWithContentsOfFile:path];
//返回数组
_apps=dataArray;
return _apps;
}else{
return _apps;
}
}
- (void)viewDidLoad {
[super viewDidLoad];
int columns=3;
//拿屏幕宽度
CGFloat viewWidth=self.view.frame.size.width;
CGFloat appW=75;
CGFloat appH=90;
CGFloat marginTop=30;
CGFloat marginX=(viewWidth-columns*appW)/(columns+1);
CGFloat marginY= marginX;
for (int i=0; i<self.apps.count; i++) {
NSLog(@"---");
// 创建单个应用的uiview
UIView *appview=[[UIView alloc]init];
appview.backgroundColor=[UIColor blueColor];
//设置view的属性
//设置每个但与昂个所在的列的索引
int colidx=i%columns;
//设置每个但与昂个所在的行的索引
int rowidx=i/columns;
CGFloat appX=marginX+colidx*(appW+marginX);
CGFloat appY=marginTop+rowidx*(appH+marginY);
appview.frame=CGRectMake(appX, appY, appW, appH);
//kong将viewd加到控制器管理的view
[self.view addSubview:appview];
//向uiview内添加子控件
//增加一个图片框
UIImageView *navigateIcon=[[UIImageView alloc]init];
navigateIcon.backgroundColor=[UIColor yellowColor];
//设置图片框view的frame尺寸
CGFloat iconW=45;
CGFloat iconH=45;
CGFloat iconX=(appview.frame.size.width-iconW)/2;
CGFloat iconY=0;
navigateIcon.frame=CGRectMake(iconX, iconY, iconW, iconH);
//将子控件添加进去
[appview addSubview:navigateIcon];
//增加一个lable说明
UILabel *introduce=[[UILabel alloc]init];
introduce.backgroundColor=[UIColor redColor];
CGFloat intrW=appview.frame.size.width;
CGFloat intrH=20;
CGFloat intrX=0;
CGFloat intrY=iconH;
introduce.frame=CGRectMake(intrX, intrY, intrW, intrH);
[appview addSubview:introduce];
//增加一个按钮
UIButton *download=[[UIButton alloc]init];
download.backgroundColor=[UIColor systemPinkColor];
CGFloat downloadW=iconW;
CGFloat downloadH=20;
CGFloat downloadX=iconX;
CGFloat downloadY=CGRectGetMaxY(introduce.frame);
download.frame=CGRectMake(downloadX, downloadY, downloadW, downloadH);
//将子控件添加进去
[appview addSubview:download]
}
}
@end
3.将数据(字典内图片,文字)加载到控件中,设置控件基本表现形式,并给按钮添加事件(add target)
接口部分
@interface ViewController ()
//用来保存所有应用的数据
@property(nonatomic,strong)NSArray * apps;
@end
实现部分
@implementation ViewController
//懒加载数据
-(NSArray *)apps{
if (_apps==nil) {
//加载数据
//获取plist文件路径
NSString *path=[[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil];
//获取plist文件资源
NSArray *dataArray=[NSArray arrayWithContentsOfFile:path];
//返回数组
_apps=dataArray;
return _apps;
}else{
return _apps;
}
}
- (void)viewDidLoad {
[super viewDidLoad];
int columns=3;
//拿屏幕宽度
CGFloat viewWidth=self.view.frame.size.width;
CGFloat appW=75;
CGFloat appH=90;
CGFloat marginTop=30;
CGFloat marginX=(viewWidth-columns*appW)/(columns+1);
CGFloat marginY= marginX;
for (int i=0; i<self.apps.count; i++) {
//获取plist文件中的每条字典数据
NSDictionary *dataDictionary=self.apps[i];
// 创建单个应用的uiview
UIView *appview=[[UIView alloc]init];
//设置view的属性
//设置每个但与昂个所在的列的索引
int colidx=i%columns;
//设置每个但与昂个所在的行的索引
int rowidx=i/columns;
CGFloat appX=marginX+colidx*(appW+marginX);
CGFloat appY=marginTop+rowidx*(appH+marginY);
appview.frame=CGRectMake(appX, appY, appW, appH);
//kong将viewd加到控制器管理的view
[self.view addSubview:appview];
//向uiview内添加子控件
//增加一个图片框
UIImageView *navigateIcon=[[UIImageView alloc]init];
//设置图片框view的frame尺寸
CGFloat iconW=45;
CGFloat iconH=45;
CGFloat iconX=(appview.frame.size.width-iconW)/2;
CGFloat iconY=0;
navigateIcon.frame=CGRectMake(iconX, iconY, iconW, iconH);
//将子控件添加进去
[appview addSubview:navigateIcon];
//在图片框中添加图片数据
navigateIcon.image=[UIImage imageNamed: dataDictionary[@"icon"]];
//增加一个lable说明
UILabel *introduce=[[UILabel alloc]init];
CGFloat intrW=appview.frame.size.width;
CGFloat intrH=20;
CGFloat intrX=0;
CGFloat intrY=iconH;
introduce.frame=CGRectMake(intrX, intrY, intrW, intrH);
[appview addSubview:introduce];
introduce.text=dataDictionary[@"name"];
introduce.font=[UIFont systemFontOfSize:12];//设置文本大小,使用uifont的类方法
introduce.textAlignment=NSTextAlignmentCenter;
//增加一个按钮
UIButton *download=[[UIButton alloc]init];
CGFloat downloadW=iconW;
CGFloat downloadH=20;
CGFloat downloadX=iconX;
CGFloat downloadY=CGRectGetMaxY(introduce.frame);
download.frame=CGRectMake(downloadX, downloadY, downloadW, downloadH);
//将子控件添加进去
[appview addSubview:download];
//设置按钮的文字,按钮的设置不是通过属性来设置,而是通过方法来设置
[download setTitle:@"下载" forState:UIControlStateNormal];
[download setTitle:@"已安装" forState:UIControlStateHighlighted];
//设置按钮的背景图
[download setBackgroundImage:[UIImage imageNamed:@"bgnormal.jpg"] forState:UIControlStateNormal];
[download setBackgroundImage:[UIImage imageNamed:@"bghighlight.jpg"] forState:UIControlStateHighlighted];
download.titleLabel.font=[UIFont systemFontOfSize:12];
//给按钮设置一个单击事件,这里action需要由自己编写,即@selector后面的内容
[download addTarget:self action:@selector(btdownloadClick) forControlEvents:UIControlEventTouchUpInside];
}
}
//添加一个单击事件响应方法
-(void)btdownloadClick{
NSLog(@"单击按钮被点击了");
}
@end
效果
4.字典转模型
- 字典转模型
0> 字典转模型的含义: 把字典中的数据使用模型来保存。新建一个类, 根据字典中键值对的个数, 来编写这个类中的属性, 将来用这个类的对象的属性来保存字典中每个键对应的值。
1> 为什么要把字典转成模型?
-
字典缺陷:
0> 写代码的时候字典的键没有智能提示, 但是模型的属性可以有智能提示
1> "键"是字符串, 如果写错了, 编译器不报错(在编译的时候不报错), 运行时可能出错, 出错了很难找错。
2> 使用"模型"可以更方便的使用面向对象的3大特(封装、继承、多态)性进行扩展。 -
什么是模型? "模型"就是自定义的类, 通过为"类"增加各种属性来保存数据。
-
字典转模型要修改哪里的代码?
1> 创建一个模型类
2> 在懒加载数据的时候, 把加载到的数据都放到模型对象中, 然后再把模型对象放到数组中。
声明一个新的类App.h
@interface App : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *icon;
@end
接口部分
#import "App.h"
@interface ViewController ()
//用来保存所有应用的数据
@property(nonatomic,strong)NSArray * apps;
@end
实现部分
@implementation ViewController
//懒加载数据
-(NSArray *)apps{
if (_apps==nil) {
//加载数据
//获取plist文件路径
NSString *path=[[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil];
//获取plist文件资源
NSArray *dataArray=[NSArray arrayWithContentsOfFile:path];
//创建一个可变数组
NSMutableArray *arrayModelsM=[NSMutableArray array];
//循环字典数组,把每个字典对象转换一个模型对象
for (NSDictionary *dictionary in dataArray) {
//创建一个模型
App *model=[[App alloc]init];
model.name=dictionary[@"name"];
model.icon=dictionary[@"icon"];
//将模型加入可变数组中去
[arrayModelsM addObject:model];
}
//返回数组
_apps=arrayModelsM;
return _apps;
}else{
return _apps;
}
}
- (void)viewDidLoad {
[super viewDidLoad];
int columns=3;
//拿屏幕宽度
CGFloat viewWidth=self.view.frame.size.width;
CGFloat appW=75;
CGFloat appH=90;
CGFloat marginTop=30;
CGFloat marginX=(viewWidth-columns*appW)/(columns+1);
CGFloat marginY= marginX;
for (int i=0; i<self.apps.count; i++) {
//获取plist文件中的每条字典数据
App *dataDictionary=self.apps[i];
// 创建单个应用的uiview
UIView *appview=[[UIView alloc]init];
//设置view的属性
//设置每个但与昂个所在的列的索引
int colidx=i%columns;
//设置每个但与昂个所在的行的索引
int rowidx=i/columns;
CGFloat appX=marginX+colidx*(appW+marginX);
CGFloat appY=marginTop+rowidx*(appH+marginY);
appview.frame=CGRectMake(appX, appY, appW, appH);
//kong将viewd加到控制器管理的view
[self.view addSubview:appview];
//向uiview内添加子控件
//增加一个图片框
UIImageView *navigateIcon=[[UIImageView alloc]init];
//设置图片框view的frame尺寸
CGFloat iconW=45;
CGFloat iconH=45;
CGFloat iconX=(appview.frame.size.width-iconW)/2;
CGFloat iconY=0;
navigateIcon.frame=CGRectMake(iconX, iconY, iconW, iconH);
//将子控件添加进去
[appview addSubview:navigateIcon];
//在图片框中添加图片数据
navigateIcon.image=[UIImage imageNamed: dataDictionary.icon];
//增加一个lable说明
UILabel *introduce=[[UILabel alloc]init];
CGFloat intrW=appview.frame.size.width;
CGFloat intrH=20;
CGFloat intrX=0;
CGFloat intrY=iconH;
introduce.frame=CGRectMake(intrX, intrY, intrW, intrH);
[appview addSubview:introduce];
introduce.text=dataDictionary.name;
introduce.font=[UIFont systemFontOfSize:12];//设置文本大小,使用uifont的类方法
introduce.textAlignment=NSTextAlignmentCenter;
//增加一个按钮
UIButton *download=[[UIButton alloc]init];
CGFloat downloadW=iconW;
CGFloat downloadH=20;
CGFloat downloadX=iconX;
CGFloat downloadY=CGRectGetMaxY(introduce.frame);
download.frame=CGRectMake(downloadX, downloadY, downloadW, downloadH);
//将子控件添加进去
[appview addSubview:download];
//设置按钮的文字,按钮的设置不是通过属性来设置,而是通过方法来设置
[download setTitle:@"下载" forState:UIControlStateNormal];
[download setTitle:@"已安装" forState:UIControlStateHighlighted];
//设置按钮的背景图
[download setBackgroundImage:[UIImage imageNamed:@"bgnormal.jpg"] forState:UIControlStateNormal];
[download setBackgroundImage:[UIImage imageNamed:@"bghighlight.jpg"] forState:UIControlStateHighlighted];
download.titleLabel.font=[UIFont systemFontOfSize:12];
//给按钮设置一个单击事件,这里action需要由自己编写,即@selector后面的内容
[download addTarget:self action:@selector(btdownloadClick) forControlEvents:UIControlEventTouchUpInside];
}
}
//添加一个单击事件响应方法
-(void)btdownloadClick{
NSLog(@"单击按钮被点击了");
}
@end
效果同上例
5.字典转模型改进
直接对模型部分进行修改直接增加init方法,APP.h类中
接口部分
@interface App : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *icon;
-(App *)initWithDict:(NSDictionary *)dict;
+(App *)appWithDict:(NSDictionary *)dict;
@end
实现部分
@implementation App
-(App *)initWithDict:(NSDictionary *)dict{
if (self=[super init]) {
self.name=dict[@"name"];
self.icon=dict[@"icon"];
}
return self;
}
+(App *)appWithDict:(NSDictionary *)dict{
return [[self alloc]initWithDict:dict];
}
@end
6.字典转模型再改进
- id与instancetype的介绍
-
使用id作为方法返回值的问题:
1> 在接收方法的返回值的时候可以使用任何类型来接收, 编译都不报错, 但是运行时可能出错。 -
instancetype需要注意的点
1> instancetype在类型表示上, 与id意思一样, 都表示任何对象类型
2> instancetype只能用作返回值类型, 不能向id一样声明变量、用作参数等
3> 使用instancetype, 编译器会检测instancetype的真实类型, 如果类型不匹配, 编译时就报错了。(instancetype出现在哪个类型中就表示对应的类型)
@interface App : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *icon;
-(instancetype)initWithDict:(NSDictionary *)dict;
+(instancetype)appWithDict:(NSDictionary *)dict;
@end
实现部分
@implementation App
-(instancetype)initWithDict:(NSDictionary *)dict{
if (self=[super init]) {
self.name=dict[@"name"];
self.icon=dict[@"icon"];
}
return self;
}
+(instancetype)appWithDict:(NSDictionary *)dict{
return [[self alloc]initWithDict:dict];
}
@end
7.插播代码折叠快捷键
shift+option+command+左光标(折叠)
shift+option+command+右光标(展开)
8.通过xib来实现应用界面(同时应用模型方法)
1直接对模型部分进行修改直接增加init方法,APP.h类中
接口部分
@interface App : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *icon;
-(App *)initWithDict:(NSDictionary *)dict;
+(App *)appWithDict:(NSDictionary *)dict;
@end
2APP.h类中实现部分
@implementation App
-(instancetype)initWithDict:(NSDictionary *)dict{
if (self=[super init]) {
self.name=dict[@"name"];
self.icon=dict[@"icon"];
}
return self;
}
+(instancetype)appWithDict:(NSDictionary *)dict{
return [[self alloc]initWithDict:dict];
}
@end
3绘制xib布局FRAPP.xib,实际是自定义了一个view组件
如下图
4创建xib的关联类FRApp.h
在xib编辑界面中关联FRApp类
5对FRAppxib文件内的控件进行拖线,得到各个属性
FRApp.h内代码如下
#import "App.h"
//@class App;
@interface FRApp : UIView
@property(nonatomic,strong) App * model;
@end
FRApp.m内代码如下
#import "FRApp.h"
#import "App.h"
@interface FRApp()
@property (weak, nonatomic) IBOutlet UIImageView *imageViewIcon;
@property (weak, nonatomic) IBOutlet UILabel *lblName;
@property (weak, nonatomic) IBOutlet UIButton *btnDownload;
@end
@implementation FRApp
//重写model属性的set方法
-(void)setModel:(App *)model{
//先赋值
_model=model;
//解析模型数据,把模型数据赋值给uiview的各个子控件
self.imageViewIcon.image=[UIImage imageNamed:model.icon];
self.lblName.text=model.name;
}
@end
6viewController部分代码
接口部分
#import "ViewController.h"
#import "App.h"
#import "FRApp.h"
@interface ViewController ()
//用来保存所有应用的数据
@property(nonatomic,strong)NSArray * apps;
@end
实现部分
@implementation ViewController
//懒加载数据
-(NSArray *)apps{
if (_apps==nil) {
//加载数据
//获取plist文件路径
NSString *path=[[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil];
//获取plist文件资源
NSArray *dataArray=[NSArray arrayWithContentsOfFile:path];
//创建一个可变数组
NSMutableArray *arrayModelsM=[NSMutableArray array];
//循环字典数组,把每个字典对象转换一个模型对象
for (NSDictionary *dictionary in dataArray) {
//创建一个模型
App *model=[[App alloc]init];
model.name=dictionary[@"name"];
model.icon=dictionary[@"icon"];
//将模型加入可变数组中去
[arrayModelsM addObject:model];
}
//返回数组
_apps=arrayModelsM;
return _apps;
}else{
return _apps;
}
}
- (void)viewDidLoad {
[super viewDidLoad];
int columns=3;
//拿屏幕宽度
CGFloat viewWidth=self.view.frame.size.width;
CGFloat appW=75;
CGFloat appH=90;
CGFloat marginTop=30;
CGFloat marginX=(viewWidth-columns*appW)/(columns+1);
CGFloat marginY= marginX;
for (int i=0; i<self.apps.count; i++) {
//获取plist文件中的每条字典数据
App *dataDictionary=self.apps[i];
//获取应用的根目录
NSBundle *rootBundle=[NSBundle mainBundle];
// 通过xib创建单个应用的uiview
FRApp *appview=[[rootBundle loadNibNamed:@"FRApp" owner:nil options:nil] lastObject];
//设置view的属性
//设置每个但与昂个所在的列的索引
int colidx=i%columns;
//设置每个但与昂个所在的行的索引
int rowidx=i/columns;
CGFloat appX=marginX+colidx*(appW+marginX);
CGFloat appY=marginTop+rowidx*(appH+marginY);
appview.frame=CGRectMake(appX, appY, appW, appH);
//kong将viewd加到控制器管理的view
[self.view addSubview:appview];
//设置xib子控件数据
// appview.imageViewIcon.image=[UIImage imageNamed:dataDictionary.icon];
// appview.lblName.text=dataDictionary.name;
//以上两行代码能够实现,但是不够简约,x还需要赋值
appview.model=dataDictionary;
}
}
@end
效果同上例
9.通过xib来实现应用界面(同时应用模型方法,还实现点击弹出消息提示框)
本例和上例子有大部分代码重复
1直接对模型部分进行修改直接增加init方法,APP.h类中
接口部分
@interface App : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *icon;
-(App *)initWithDict:(NSDictionary *)dict;
+(App *)appWithDict:(NSDictionary *)dict;
@end
2APP.h类中实现部分
@implementation App
-(instancetype)initWithDict:(NSDictionary *)dict{
if (self=[super init]) {
self.name=dict[@"name"];
self.icon=dict[@"icon"];
}
return self;
}
+(instancetype)appWithDict:(NSDictionary *)dict{
return [[self alloc]initWithDict:dict];
}
@end
3绘制xib布局FRAPP.xib,实际是自定义了一个view组件
如下图
4创建xib的关联类FRApp.h
在xib编辑界面中关联FRApp类
5对FRAppxib文件内的控件进行拖线,得到各个属性
FRApp.h内代码如下
#import "App.h"
//@class App;
@interface FRApp : UIView
@property(nonatomic,strong) App * model;
@end
FRApp.m内代码如下
实现消息提示框功能主要在这里实现,重点关注其animation方法的使用
#import "FRApp.h"
#import "App.h"
@interface FRApp()
@property (weak, nonatomic) IBOutlet UIImageView *imageViewIcon;
@property (weak, nonatomic) IBOutlet UILabel *lblName;
@property (weak, nonatomic) IBOutlet UIButton *btnDownload;
- (IBAction)btdownloadClick:(UIButton *)sender;
@end
@implementation FRApp
//重写model属性的set方法
-(void)setModel:(App *)model{
//先赋值
_model=model;
//解析模型数据,把模型数据赋值给uiview的各个子控件
self.imageViewIcon.image=[UIImage imageNamed:model.icon];
self.lblName.text=model.name;
}
//添加一个单击事件响应方法
- (IBAction)btdownloadClick:(UIButton *)sender {
//禁用当前被点击的按钮
sender.enabled=NO;
//弹出一个消息提醒框(实际上就是一个UILable)
UILabel * message=[[UILabel alloc]init];
//设置message的view的属性
message.text=@"正在下载";
message.backgroundColor=[UIColor blackColor];
//设置message的frame
CGFloat viewW=self.superview.frame.size.width;
CGFloat viewH=self.superview.frame.size.height;
CGFloat msgW=200;
CGFloat msgH=30;
CGFloat msgX=(viewW-msgW)/2;
CGFloat msgY=(viewH-msgH)/2;
//生成这个frame
message.frame=CGRectMake(msgX, msgY,msgW, msgH);
//设置message文字的颜色,位置
message.textColor=[UIColor redColor];
message.textAlignment=NSTextAlignmentCenter;
message.font=[UIFont boldSystemFontOfSize:17];
//设置message的透明度
//动画开始时alpha设置为0
message.alpha=0;
//设置message对话框的圆角
//设置四周圆角的半径
message.layer.cornerRadius=5;
//把多余的部分裁剪掉
message.layer.masksToBounds=YES;
//通过动画方式来显示message(使用block方式)
/*
[UIView animateWithDuration:1.5 animations:^{
message.alpha=0.7;
}];
*/
//或者使用这种方式也可以实现动画效果,并且增加了淡出且移除的效果
[UIView animateWithDuration:1.5 animations:^{
message.alpha=0.7;
}completion:^(BOOL finished) {
if (finished) {
//隔一段时间再启动另外一个动画
[UIView animateWithDuration:1.5 delay:1 options:UIViewAnimationOptionCurveLinear animations:^{
message.alpha=0;
} completion:^(BOOL finished) {
//当message的透明度变成0以后,再把这个messages从view中移除
[message removeFromSuperview];
}];
}
}];
//把message加到控制器管理的那个view上
[self.superview addSubview:message];
}
@end
6viewController部分代码
接口部分
#import "ViewController.h"
#import "App.h"
#import "FRApp.h"
@interface ViewController ()
//用来保存所有应用的数据
@property(nonatomic,strong)NSArray * apps;
@end
实现部分
@implementation ViewController
//懒加载数据
-(NSArray *)apps{
if (_apps==nil) {
//加载数据
//获取plist文件路径
NSString *path=[[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil];
//获取plist文件资源
NSArray *dataArray=[NSArray arrayWithContentsOfFile:path];
//创建一个可变数组
NSMutableArray *arrayModelsM=[NSMutableArray array];
//循环字典数组,把每个字典对象转换一个模型对象
for (NSDictionary *dictionary in dataArray) {
//创建一个模型
App *model=[[App alloc]init];
model.name=dictionary[@"name"];
model.icon=dictionary[@"icon"];
//将模型加入可变数组中去
[arrayModelsM addObject:model];
}
//返回数组
_apps=arrayModelsM;
return _apps;
}else{
return _apps;
}
}
- (void)viewDidLoad {
[super viewDidLoad];
int columns=3;
//拿屏幕宽度
CGFloat viewWidth=self.view.frame.size.width;
CGFloat appW=75;
CGFloat appH=90;
CGFloat marginTop=30;
CGFloat marginX=(viewWidth-columns*appW)/(columns+1);
CGFloat marginY= marginX;
for (int i=0; i<self.apps.count; i++) {
//获取plist文件中的每条字典数据
App *dataDictionary=self.apps[i];
//获取应用的根目录
NSBundle *rootBundle=[NSBundle mainBundle];
// 通过xib创建单个应用的uiview
FRApp *appview=[[rootBundle loadNibNamed:@"FRApp" owner:nil options:nil] lastObject];
//设置view的属性
//设置每个但与昂个所在的列的索引
int colidx=i%columns;
//设置每个但与昂个所在的行的索引
int rowidx=i/columns;
CGFloat appX=marginX+colidx*(appW+marginX);
CGFloat appY=marginTop+rowidx*(appH+marginY);
appview.frame=CGRectMake(appX, appY, appW, appH);
//kong将viewd加到控制器管理的view
[self.view addSubview:appview];
//设置xib子控件数据
// appview.imageViewIcon.image=[UIImage imageNamed:dataDictionary.icon];
// appview.lblName.text=dataDictionary.name;
//以上两行代码能够实现,但是不够简约,x还需要赋值
appview.model=dataDictionary;
}
}
@end
效果