一 概述
本文介绍自定义视图和自定义模型相关的操作
-
如何创建自定义视图
-
使用模型设置自定义视图的显示
<!--more-->
二 创建自定义视图
-
依次点击:Xcode——>New File——>Cocoa Touch Class,创建的文件继承UIView
-
点击AppView.xib,在Custom Class的Class下拉列表中选择AppView
三 代码
3.1 OC模式下
AppInfo.h
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface AppInfo : NSObject @property (nonatomic,copy) NSString *name; @property (nonatomic,copy) NSString *icon; @property (nonatomic,strong,readonly) UIImage *image; /**使用字典实例化模型 */ -(id)initWithDict:(NSDictionary *)dict; /**类方法,可以快速示例化一个对象 */ +(id)appInfoWithDict:(NSDictionary *)dict; /**返回所有plist中的数据模型数组*/ +(NSArray *)appList; @end
AppInfo.m
#import "AppInfo.h"
@implementation AppInfo
@synthesize image=_image;
- (UIImage *)image
{
if (_image==nil) {
_image=[UIImage imageNamed:self.icon];
}
return _image;
}
- (id)initWithDict:(NSDictionary *)dict
{
self = [super init];
if (self) {
[self setValuesForKeysWithDictionary:dict];
}
return self;
}
+(id)appInfoWithDict:(NSDictionary *)dict
{
return [[self alloc]initWithDict:dict];
}
+(NSArray *)appList
{
NSArray *array=[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil]];
//创建一个临时数组
NSMutableArray *arrayM=[NSMutableArray array];
//遍历数组,一次类型转换
for (NSDictionary *dict in array)
{
AppInfo *appInfo=[AppInfo appInfoWithDict:dict];
[arrayM addObject:appInfo];
}
return arrayM;
}
@end
AppView.h
#import <UIKit/UIKit.h> #import "AppInfo.h" @interface AppView : UIView //自定义视图中显示的数据来源是数据模型,使用模型设置自定义视图的显示 @property (nonatomic,strong) AppInfo *appInfo; @end
AppView.m
#import "AppView.h"
#import "AppInfo.h"
@interface AppView()
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@property (weak, nonatomic) IBOutlet UILabel *label;
@end
@implementation AppView
//利用setter方法设置视图的界面显示
-(void)setAppInfo:(AppInfo *)appInfo
{
_appInfo=appInfo;
self.label.text=appInfo.name;
self.iconView.image=appInfo.image;
}
-(IBAction)click:(UIButton *)button
{
NSLog(@"%s--%ld",__func__,button.tag);
//添加一个UILabel到界面上
UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(100, 440, 160, 40)];
//数值是0表示黑色,1表示纯白 alpha表示透明度
label.backgroundColor=[UIColor colorWithWhite:0.0 alpha:0.2];
label.text=self.appInfo.name;
label.textAlignment=NSTextAlignmentCenter;
[self.superview addSubview:label];
label.alpha=0.0;
//禁用按钮
button.enabled=NO;
//动画效果,收尾式动画,修改对象的属性,frame,bounds,alpha
[UIView animateWithDuration:1.0f animations:^{
//要修改的动画属性
label.alpha=1.0;
} completion:^(BOOL finished) {
//动画完成后,所做的操作
[UIView animateWithDuration:1.0f animations:
^{
label.alpha=0.0;
} completion:^(BOOL finished) {
[label removeFromSuperview];
button.enabled=YES;
}];
}];
}
@end
ViewController.m
#import "ViewController.h"
#import "AppInfo.h"
#import "AppView.h"
//九宫格常量
#define kAppViewW 80 //宽
#define kAppViewH 90 //高
#define kColCount 3 //列
#define kStartY 20
@interface ViewController ()
@property (nonatomic,strong) NSArray *appList;
@end
@implementation ViewController
- (NSArray *)appList
{
if (_appList==nil) {
//将临时数组为属性赋值
_appList=[AppInfo appList];
}
return _appList;
}
- (void)viewDidLoad {
[super viewDidLoad];
//九宫格界面
CGFloat marginX=(self.view.bounds.size.width-kColCount*kAppViewW)/(kColCount+1);
CGFloat marginY=10;
for (int i=0; i<self.appList.count; i++) {
//行
// 0,1,2 ->0
//3,4,5->1
int row=i/kColCount;
//列
//0,3,6->0
//1,4,7->1
//2,5,8->2
int col=i%kColCount;
CGFloat x=marginX+col*(marginX+kAppViewW);
CGFloat y=kStartY+ marginY+row*(marginY+kAppViewH);
//从XIB来家长自定义视图
AppView *appView=[[[NSBundle mainBundle]loadNibNamed:@"AppView" owner:nil options:nil] lastObject];
//设置视图的位置
appView.frame=CGRectMake(x, y, kAppViewW, kAppViewH);
[self.view addSubview:appView];
//AppInfo *appInfo=self.appList[i];
appView.appInfo=self.appList[i];
}
}
@end