IOS开发教程第一季之UI基础day3-003

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.字典转模型
  1. 字典转模型
    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的介绍
  1. 使用id作为方法返回值的问题:
    1> 在接收方法的返回值的时候可以使用任何类型来接收, 编译都不报错, 但是运行时可能出错。

  2. 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

效果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值