IOS学习002简单的图片浏览器--懒加载plist文件数据、TomCat动画,控件尺寸、xib界面设计、字典转模型

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

效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值