1.简单图片浏览器–创建plist文件及懒加载
#import "ViewController.h"
@interface ViewController ()
@property(strong,nonatomic)NSArray* pic;
- (IBAction)lastImage:(id)sender;
@property (weak, nonatomic) IBOutlet UIButton *nextImage;
@property (weak, nonatomic) IBOutlet UILabel *txtNo;
@property (weak, nonatomic) IBOutlet UILabel *Introduce;
@end
@implementation ViewController
//重写nsarray的get方法
//此种写法为懒加载,因为知道你使用pic这个属性的时候,你才加载了数据,随用随调,而不是一开始就加载好数据待用,可以节约内存资源
-(NSArray*)pic{
if (_pic==nil) {
//加载images.plist文件到_pic中
//1、获取plist文件路径,NSBundle就是获取系统路径[NSBundle mainBundle]表示获取这个app安装到手机上时的根目录,并在根目录下搜索该plist文件
NSString* path=[[NSBundle mainBundle]pathForResource:@"images" ofType:@".plist"];
//NSString* path=[[NSBundle mainBundle]pathForResource:@"images.plist" ofType:nil];//与上句等效
//2、从路径中读取文件
NSArray* array=[NSArray arrayWithContentsOfFile:path];
//3、将数组array赋值给pic属性
_pic=array;
NSLog(@"%ld",_pic.count);
}
return _pic;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.pic;
// Do any additional setup after loading the view.
}
- (IBAction)lastImage:(id)sender {
}
@end
打印
2020-06-19 11:03:22.119937+0800 IOS034[1525:100859] 6
2.简单图片浏览器–实现
#import "ViewController.h"
@interface ViewController ()
//存放图片路径的数组
@property(strong,nonatomic)NSArray* pic;
//显示当前第几张图片索引的变量
@property(assign,nonatomic)int index;
@property (weak, nonatomic) IBOutlet UIImageView *showImage;
@property (weak, nonatomic) IBOutlet UIButton *next;
@property (weak, nonatomic) IBOutlet UIButton *last;
@property (weak, nonatomic) IBOutlet UILabel *txtNo;
@property (weak, nonatomic) IBOutlet UILabel *Introduce;
- (IBAction)nextImage:(id)sender;
- (IBAction)lastImage:(id)sender;
@end
@implementation ViewController
//重写nsarray的get方法
//此种写法为懒加载,因为知道你使用pic这个属性的时候,你才加载了数据,随用随调,而不是一开始就加载好数据待用,可以节约内存资源
-(NSArray*)pic{
if (_pic==nil) {
//加载images.plist文件到_pic中
//1、获取plist文件路径,NSBundle就是获取系统路径[NSBundle mainBundle]表示获取这个app安装到手机上时的根目录,并在根目录下搜索该plist文件
NSString* path=[[NSBundle mainBundle]pathForResource:@"images" ofType:@".plist"];
//NSString* path=[[NSBundle mainBundle]pathForResource:@"images.plist" ofType:nil];//与上句等效
//2、从路径中读取文件
NSArray* array=[NSArray arrayWithContentsOfFile:path];
//3、将数组array赋值给pic属性
_pic=array;
}
return _pic;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (IBAction)lastImage:(id)sender {
//1、让索引--
self.index--;
//2、从数组中获取当前索引的图片
NSDictionary* dict=self.pic[self.index];
//3、把获取到的数据(图片)设置到界面上的控件
self.txtNo.text=[NSString stringWithFormat:@"%d/%ld",self.index+1,self.pic.count];
//4、通过image属性来配置图片框里面的图片
self.showImage.image=[UIImage imageNamed:dict[@"icon"]];
//5、配置图片说明
self.Introduce.text=dict[@"title"];
//6、设置上一张是否可以点击
if (self.index==0) {
self.last.enabled=NO;
}else{
self.last.enabled=YES;
}
}
- (IBAction)nextImage:(id)sender {
//1、让索引++
self.index++;
//2、从数组中获取当前索引的图片
NSDictionary* dict=self.pic[self.index];
//3、把获取到的数据(图片)设置到界面上的控件
self.txtNo.text=[NSString stringWithFormat:@"%d/%ld",self.index+1,self.pic.count];
//4、通过image属性来配置图片框里面的图片
self.showImage.image=[UIImage imageNamed:dict[@"icon"]];
//5、配置图片说明
self.Introduce.text=dict[@"title"];
//6、设置下一张是否可以点击
self.next.enabled=self.index!=self.pic.count-1;
}
@end
进一步改进
#import "ViewController.h"
@interface ViewController ()
//存放图片路径的数组
@property(strong,nonatomic)NSArray* pic;
//显示当前第几张图片索引的变量
@property(assign,nonatomic)int index;
@property (weak, nonatomic) IBOutlet UIImageView *showImage;
@property (weak, nonatomic) IBOutlet UIButton *next;
@property (weak, nonatomic) IBOutlet UIButton *last;
@property (weak, nonatomic) IBOutlet UILabel *txtNo;
@property (weak, nonatomic) IBOutlet UILabel *Introduce;
- (IBAction)nextImage:(id)sender;
- (IBAction)lastImage:(id)sender;
@end
@implementation ViewController
//重写nsarray的get方法
//此种写法为懒加载,因为知道你使用pic这个属性的时候,你才加载了数据,随用随调,而不是一开始就加载好数据待用,可以节约内存资源
-(NSArray*)pic{
if (_pic==nil) {
//加载images.plist文件到_pic中
//1、获取plist文件路径,NSBundle就是获取系统路径[NSBundle mainBundle]表示获取这个app安装到手机上时的根目录,并在根目录下搜索该plist文件
NSString* path=[[NSBundle mainBundle]pathForResource:@"images" ofType:@".plist"];
//NSString* path=[[NSBundle mainBundle]pathForResource:@"images.plist" ofType:nil];//与上句等效
//2、从路径中读取文件
NSArray* array=[NSArray arrayWithContentsOfFile:path];
//3、将数组array赋值给pic属性
_pic=array;
}
return _pic;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (IBAction)lastImage:(id)sender {
//1、让索引--
self.index--;
//设置控件数据
[self setData];
}
- (IBAction)nextImage:(id)sender {
//1、让索引++
self.index++;
//设置控件数据
[self setData];
}
-(void)setData{
//2、从数组中获取当前索引的图片
NSDictionary* dict=self.pic[self.index];
//3、把获取到的数据(图片)设置到界面上的控件
self.txtNo.text=[NSString stringWithFormat:@"%d/%ld",self.index+1,self.pic.count];
//4、通过image属性来配置图片框里面的图片
self.showImage.image=[UIImage imageNamed:dict[@"icon"]];//icon是plist里面对应的键
//5、配置图片说明
self.Introduce.text=dict[@"title"];//icon是plist里面对应的键
//6、设置上下一张是否可以点击
self.next.enabled=self.index!=self.pic.count-1;
self.last.enabled=(self.index!=0);
}
@end
3.TomCat动画1
#import "ViewController.h"
@interface ViewController ()
- (IBAction)drinkMilk:(id)sender;
@property (weak, nonatomic) IBOutlet UIImageView *tomCat;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
//喝牛奶动画
- (IBAction)drinkMilk:(id)sender {
//1、加载图片到一个nsarray
NSMutableArray * tomImagesM=[NSMutableArray array];
for (int i=0; i<81; i++) {
NSString* imagename=[NSString stringWithFormat:@"drink_%02d.jpg",i];
UIImage* image=[UIImage imageNamed:imagename];
[tomImagesM addObject:image];
//NSLog(@"%@",imagename);
}
//2、设置图片的animationIamges属性,属性包含的就是那些要执行动画的图片
//对于animationImages属性直接给到一个数组过去就可以了
self.tomCat.animationImages=tomImagesM;
//3.设置动画时间及是否重复播放
self.tomCat.animationDuration=self.tomCat.animationImages.count*0.1;
self.tomCat.animationRepeatCount=1;
//4.开启动画
[self.tomCat startAnimating];
}
@end
4.TomCat动画封装后改良版本
#import "ViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *tomCat;
- (IBAction)doFart;
- (IBAction)knock;
- (IBAction)drinkMilk:(id)sender;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
-(void)startAnimating:(int)count imageName:(NSString*)name{
//判断是否正在动画中,如果在动画中就什么都不做
if (self.tomCat.isAnimating) {
return;
}
//1、加载图片到一个nsarray
NSMutableArray * tomImagesM=[NSMutableArray array];
for (int i=0; i<count; i++) {
NSString* imagename=[NSString stringWithFormat:@"%@_%02d.jpg",name,i];
//UIImage* image=[UIImage imageNamed:imagename];//imageNamed容易导致缓存过多
NSString* path=[[NSBundle mainBundle]pathForResource:imagename ofType:nil];
UIImage *imgcat=[UIImage imageWithContentsOfFile:path];
[tomImagesM addObject:imgcat];
//NSLog(@"%@",imagename);
}
//2、设置图片的animationIamges属性,属性包含的就是那些要执行动画的图片
//对于animationImages属性直接给到一个数组过去就可以了
self.tomCat.animationImages=tomImagesM;
//3.设置动画时间及是否重复播放
//self.tomCat.animationDuration=self.tomCat.animationImages.count*0.1;
self.tomCat.animationRepeatCount=1;
//4.开启动画
[self.tomCat startAnimating];
//调用图片框在调用setAnimationImage:nil方法的时候延迟执行
[self.tomCat performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:self.tomCat.animationImages.count*0.1];
}
//喝牛奶动画
- (IBAction)drinkMilk:(id)sender {
[self startAnimating:81 imageName:@"drink"];
}
//桥头动画
- (IBAction)knock {
}
//放屁动画
- (IBAction)doFart {
[self startAnimating:28 imageName:@"fart"];
}
@end
4.九宫格排列控件(控件的加载与位置的排列)
#import "ViewController.h"
@interface ViewController ()
//用来保存所有应用的数据
@property(nonatomic,strong) NSArray* apps;
@end
@implementation ViewController
//重写app的get方法,这就是懒加载
-(NSArray*)apps{
if (_apps==nil) {
//加载数据
//1、获取plist文件路径
NSString* path=[[NSBundle mainBundle]pathForResource:@"appdatas.plist" ofType:nil];
//2、赋值array
_apps=[NSArray arrayWithContentsOfFile:path];
}
return _apps;
}
- (void)viewDidLoad {
[super viewDidLoad];
//每行应用的个数
int colums=3;
//控制器管理的view的宽度
CGFloat viewWith=self.view.frame.size.width;
//子view的宽高
CGFloat appw=75;
CGFloat apph=90;
CGFloat marginTop=70;//首行距离顶部的距离
CGFloat marginX=(viewWith-colums*appw)/(colums+1);
CGFloat marginY=marginX;
for (int i=0; i<self.apps.count; i++) {
//1、创建每一个应用的appviewI,并设置其属性
UIView* appView=[[UIView alloc]init];
//1.1设置背景色、frame
//appView.backgroundColor=[UIColor grayColor];
//1.2设置appview的frame属性
int colIdx=i%colums;//获取行索引
int rowIdx=i/colums;//获取列索引
float appx=marginX+colIdx*(appw+marginX);
float appy=marginTop+rowIdx*(apph+marginY);
appView.frame=CGRectMake(appx, appy, appw, apph);
//2、将控件加载到每个appview里去
//2.1增加一个图片框
UIImageView *appImageView=[[UIImageView alloc]init];
appImageView.backgroundColor=[UIColor yellowColor];
CGFloat iconW=45;
CGFloat iconH=45;
CGFloat iconX=(appView.frame.size.width-iconW)*0.5;
CGFloat iconY=0;
appImageView.frame=CGRectMake(iconX, iconY, iconW, iconH);
[appView addSubview:appImageView];
//设置图片框的数据
appImageView.image=[UIImage imageNamed:self.apps[i][@"icon"]];
//2.2增加一个label
UILabel *nameview=[[UILabel alloc]init];
//nameview.backgroundColor=[UIColor greenColor];
CGFloat nameW=appView.frame.size.width;
CGFloat nameH=20;
CGFloat nameX=0;
CGFloat nameY=iconH;
nameview.frame=CGRectMake(nameX, nameY, nameW, nameH);
[appView addSubview:nameview];
//设置文本框的数据
nameview.text=self.apps[i][@"name"];
nameview.textAlignment=NSTextAlignmentCenter;
nameview.font= [UIFont systemFontOfSize: 14.0];
//2.3增加一个按钮
UIButton* download=[[UIButton alloc]init];
//设置背景色及frame
//download.backgroundColor=[UIColor blueColor];
CGFloat downloadW =iconW;
CGFloat downloadH =20;
CGFloat downloadX=iconX;
CGFloat downloadY=nameY+nameH;
download.frame=CGRectMake(downloadX, downloadY, downloadW, downloadH);
[appView addSubview:download];
[download setTitle:@"下载" forState:UIControlStateNormal];
[download setTitle:@"已下载" forState:UIControlStateHighlighted];
[download setBackgroundImage:[UIImage imageNamed:@"buttongreen.png"] forState:UIControlStateNormal];
[download setBackgroundImage:[UIImage imageNamed:@"buttongreen_highlighted.png"] forState:UIControlStateHighlighted];
download.titleLabel.font=[UIFont systemFontOfSize: 14.0];
//为按钮注册一个单击事件
[download addTarget:self action:@selector(dosomtthing) forControlEvents:UIControlEventTouchUpInside];
//3,将appview加载到self.view里去
[self.view addSubview:appView];
}
}
-(void)dosomtthing{
NSLog(@"downloading files……");
}
@end
5.字典转模型
字典转模型的核心是讲plist里面的字典取出来,创建自己的类,设置与字典的键对应的类属性(成员变量),将字典的键所对应的值赋值给类的成员变量。从而完成字典转模型,将来在引用键值对时,直接通过类的成员变量来访问即可。这样也方便编译中找到一些错误。也方便使用面向对象的特征
1、之前的appData.plist文件
2、自定义FRApp类
FRApp.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface FRApp : NSObject
@property(nonatomic,copy)NSString* name;
@property(nonatomic,copy)NSString* icon;
-(FRApp*)initWithDict:(NSDictionary*)dict;
+(FRApp*)appWithDict:(NSDictionary*)dict;
@end
NS_ASSUME_NONNULL_END
FRApp.m
#import "FRApp.h"
@implementation FRApp
//这两个方法是转模型的关键方法,必不可少,最后也是通过类方法来转模型的
-(FRApp*)initWithDict:(NSDictionary*)dict{
if (self==[super init]) {
self.name=dict[@"name"];
self.icon=dict[@"icon"];
}
return self;
}
+(FRApp*)appWithDict:(NSDictionary*)dict{
return [[self alloc]initWithDict:dict];
}
@end
3、viewController.m
#import "ViewController.h"
@interface ViewController ()
//用来保存所有应用的数据
@property(nonatomic,strong) NSArray* apps;
@end
@implementation ViewController
//重写app的get方法,这就是懒加载
-(NSArray*)apps{
if (_apps==nil) {
//加载数据
//1、获取plist文件路径
NSString* path=[[NSBundle mainBundle]pathForResource:@"appdatas.plist" ofType:nil];
//2、赋值array
NSArray* arrayDict=[NSArray arrayWithContentsOfFile:path];
//3.创建一个可变数组来保存一个个的模型对象
NSMutableArray* arrayModelM=[[NSMutableArray alloc]init];
//4.循环字典数组,把每个字典对象转换成一个模型对象
for (NSDictionary* dict in arrayDict) {
//创建一个模型
/*
FRApp* model=[FRApp new];
model.name=dict[@"name"];//字典按键取值
model.icon=dict[@"icon"];
*/
FRApp* model=[FRApp appWithDict:dict];//具体字典转模型的核心方法在FRApp类中实现了
//把模型加入到可变数组arrayModelM中
[arrayModelM addObject:model];
}
_apps=arrayModelM;
}
return _apps;
}
- (void)viewDidLoad {
[super viewDidLoad];
//每行应用的个数
int colums=3;
//控制器管理的view的宽度
CGFloat viewWith=self.view.frame.size.width;
//子view的宽高
CGFloat appw=75;
CGFloat apph=90;
CGFloat marginTop=70;//首行距离顶部的距离
CGFloat marginX=(viewWith-colums*appw)/(colums+1);
CGFloat marginY=marginX;
for (int i=0; i<self.apps.count; i++) {
//获取当前应用的对象(之前是数据字典)
//NSDictionary* dict=self.apps[i];
FRApp* frModel=self.apps[i];
//1、创建每一个应用的appviewI,并设置其属性
UIView* appView=[[UIView alloc]init];
//1.1设置背景色、frame
//appView.backgroundColor=[UIColor grayColor];
//1.2设置appview的frame属性
int colIdx=i%colums;//获取行索引
int rowIdx=i/colums;//获取列索引
float appx=marginX+colIdx*(appw+marginX);
float appy=marginTop+rowIdx*(apph+marginY);
appView.frame=CGRectMake(appx, appy, appw, apph);
//2、将控件加载到每个appview里去
//2.1增加一个图片框
UIImageView *appImageView=[[UIImageView alloc]init];
appImageView.backgroundColor=[UIColor yellowColor];
CGFloat iconW=45;
CGFloat iconH=45;
CGFloat iconX=(appView.frame.size.width-iconW)*0.5;
CGFloat iconY=0;
appImageView.frame=CGRectMake(iconX, iconY, iconW, iconH);
[appView addSubview:appImageView];
//设置图片框的数据
appImageView.image=[UIImage imageNamed:frModel.icon];
//2.2增加一个label
UILabel *nameview=[[UILabel alloc]init];
//nameview.backgroundColor=[UIColor greenColor];
CGFloat nameW=appView.frame.size.width;
CGFloat nameH=20;
CGFloat nameX=0;
CGFloat nameY=iconH;
nameview.frame=CGRectMake(nameX, nameY, nameW, nameH);
[appView addSubview:nameview];
//设置文本框的数据
nameview.text=frModel.name;
nameview.textAlignment=NSTextAlignmentCenter;
nameview.font= [UIFont systemFontOfSize: 14.0];
//2.3增加一个按钮
UIButton* download=[[UIButton alloc]init];
//设置背景色及frame
//download.backgroundColor=[UIColor blueColor];
CGFloat downloadW =iconW;
CGFloat downloadH =20;
CGFloat downloadX=iconX;
CGFloat downloadY=nameY+nameH;
download.frame=CGRectMake(downloadX, downloadY, downloadW, downloadH);
[appView addSubview:download];
[download setTitle:@"下载" forState:UIControlStateNormal];
[download setTitle:@"已下载" forState:UIControlStateHighlighted];
[download setBackgroundImage:[UIImage imageNamed:@"buttongreen.png"] forState:UIControlStateNormal];
[download setBackgroundImage:[UIImage imageNamed:@"buttongreen_highlighted.png"] forState:UIControlStateHighlighted];
download.titleLabel.font=[UIFont systemFontOfSize: 14.0];
//为按钮注册一个单击事件
[download addTarget:self action:@selector(dosomtthing) forControlEvents:UIControlEventTouchUpInside];
//3,将appview加载到self.view里去
[self.view addSubview:appView];
}
}
-(void)dosomtthing{
NSLog(@"downloading files……");
}
@end
效果
6.使用xib存放控件(类似于android的layoutActivity)提高效率
xib是轻量级的,用来描述局部UI界面
在项目中创建xib文件并插入一个view,在view中修改size属性为freedom
并拖入相应的控件,如图:
FRAppView.xib
创建FRAppView类,并将FRAppView.xib的构造类指定为FRAppView
FRAppView.h
#import <UIKit/UIKit.h>
#import "FRApp.h"
NS_ASSUME_NONNULL_BEGIN
@interface FRAppView : UIView
@property(nonatomic,strong)FRApp* model;
@end
NS_ASSUME_NONNULL_END
FRAppView.m
#import "FRAppView.h"
@interface FRAppView ()
@property (weak, nonatomic) IBOutlet UIImageView *imageViewIcon;
@property (weak, nonatomic) IBOutlet UILabel *labelName;
@property (weak, nonatomic) IBOutlet UIButton *btnDownload;
- (IBAction)btnDownloadclick:(UIButton*)sender;
@end
@implementation FRAppView
//重写modl属性的set方法
-(void)setModel:(FRApp *)model{
//先赋值
_model=model;
//解析模型数据,把模型数据赋值给UIView中的各个子控件
self.imageViewIcon.image=[UIImage imageNamed:model.icon];
self.labelName.text=model.name;
[self.btnDownload setTitle:@"下载" forState:UIControlStateNormal];
[self.btnDownload setTitle:@"已下载" forState:UIControlStateHighlighted];
}
- (IBAction)btnDownloadclick:(UIButton*)sender {
//1、禁用当前被点击的按钮
sender.enabled=NO;
//2.弹出一个消息提醒框
UILabel* lblMsg=[[UILabel alloc]init];
lblMsg.text=@"正在下载";
lblMsg.backgroundColor=[UIColor grayColor];
lblMsg.textColor=[UIColor redColor];
lblMsg.textAlignment=NSTextAlignmentCenter;
lblMsg.alpha=0.0;//后续动画会调整动画显示alpha值
//设置圆角
lblMsg.layer.cornerRadius=12;
lblMsg.layer.maskedCorners=YES;
CGFloat lalMsgW=200;
CGFloat labMsgH=70;
CGFloat labMsgX=(self.superview.frame.size.width-lalMsgW)*0.5;
CGFloat labMsgY=(self.superview.frame.size.height)*0.5;
//设置动画
/*
[UIView animateWithDuration:2 animations:^{
lblMsg.alpha=0.6;
}];
*/
//开启一段动画,需要执行1.5秒
[UIView animateWithDuration:1.5 animations:^{
lblMsg.alpha=0.6;
} completion:^(BOOL finished) {
//当上面的动画执行完毕后,隔一段时间后再启动另外一个动画
//这个动画执行的时间是1.5秒,但这个动画在1秒钟后再执行
[UIView animateWithDuration:1.5 delay:1.0 options:UIViewAnimationOptionCurveLinear animations:^{
lblMsg.alpha=0.0;
} completion:^(BOOL finished) {
//当lblMsg的透明度编程0后,再把这个labelView从view中移除
[lblMsg removeFromSuperview];
}];
}];
lblMsg.frame=CGRectMake(labMsgX, labMsgY, lalMsgW, labMsgH);
//3、把labMsg加入到控制器所管理的view上
[self.superview addSubview:lblMsg];
}
//为自定义view增加一个类方法
+(instancetype)appView{
//1.1找到应用的根目录
NSBundle* mainBundle=[NSBundle mainBundle];
//1.2在应用程序根目录下搜索对应的xib文件
FRAppView* appView=[[mainBundle loadNibNamed:@"FRAppView" owner:nil options:nil] lastObject];
return appView;
}
@end
ViewController.h
#import <UIKit/UIKit.h>
#import "FRApp.h"
#import "FRAppView.h"
@interface ViewController : UIViewController
@end
ViewController.m
#import "ViewController.h"
@interface ViewController ()
//用来保存所有应用的数据
@property(nonatomic,strong) NSArray* apps;
@end
@implementation ViewController
//重写app的get方法,这就是懒加载
-(NSArray*)apps{
if (_apps==nil) {
//加载数据
//1、获取plist文件路径
NSString* path=[[NSBundle mainBundle]pathForResource:@"appdatas.plist" ofType:nil];
//2、赋值array
NSArray* arrayDict=[NSArray arrayWithContentsOfFile:path];
//3.创建一个可变数组来保存一个个的模型对象
NSMutableArray* arrayModelM=[[NSMutableArray alloc]init];
//4.循环字典数组,把每个字典对象转换成一个模型对象
for (NSDictionary* dict in arrayDict) {
//创建一个模型
/*
FRApp* model=[FRApp new];
model.name=dict[@"name"];//字典按键取值
model.icon=dict[@"icon"];
*/
FRApp* model=[FRApp appWithDict:dict];//具体字典转模型的核心方法在FRApp类中实现了
//把模型加入到可变数组arrayModelM中
[arrayModelM addObject:model];
}
_apps=arrayModelM;
}
return _apps;
}
- (void)viewDidLoad {
[super viewDidLoad];
//每行应用的个数
int colums=3;
//控制器管理的view的宽度
CGFloat viewWith=self.view.frame.size.width;
//子view的宽高
CGFloat appw=75;
CGFloat apph=90;
CGFloat marginTop=70;//首行距离顶部的距离
CGFloat marginX=(viewWith-colums*appw)/(colums+1);
CGFloat marginY=marginX;
for (int i=0; i<self.apps.count; i++) {
//获取当前应用的对象(之前是数据字典)
//NSDictionary* dict=self.apps[i];
FRApp* frModel=self.apps[i];
//1、通过xib创建每一个应用的appview
FRAppView* appView=[FRAppView appView];
//1.3设置appview内部各控件的数据
/*
appView.imageViewIcon.image=[UIImage imageNamed:frModel.icon];
appView.labelName.text=frModel.name;
[appView.btnDownload setTitle:@"下载" forState:UIControlStateNormal];
[appView.btnDownload setTitle:@"已下载" forState:UIControlStateHighlighted];
[appView.btnDownload addTarget:self action:@selector(dosomtthing) forControlEvents:UIControlEventTouchUpInside];
*/
//将字典转模型后的model(数据模型)赋值给xib的model,完成了模型的传递
appView.model=frModel;
//1.1设置背景色、frame
//1.2设置appview的frame属性
int colIdx=i%colums;//获取行索引
int rowIdx=i/colums;//获取列索引
float appx=marginX+colIdx*(appw+marginX);
float appy=marginTop+rowIdx*(apph+marginY);
appView.frame=CGRectMake(appx, appy, appw, apph);
//3,将appview加载到self.view里去
[self.view addSubview:appView];
}
}
@end
效果: