自定义View的封装(代码方式)
来源:互联网 发布:b超双顶径数据分男女 编辑:程序博客网 时间:2024/05/22 06:11
view的封装
- 如果一个view内部的子空间比较多,一般会考虑自定义一个view,把它内部子控件的创建屏蔽起来,不让外界关心
- 外界可以传入对应的数据模型给view,view拿到模型数据后给内部的子控件设置对应的数据
封装控件的基本步骤
- 第一步:在initWithFrame:方法中添加子控件,提供便利构造
- 调用init方法,会自动调用initWithFrame:方法
- (instancetype)initWithFrame:(CGRect)frame{ if (self = [super init]) { _imageView = [[UIImageView alloc]init]; [_imageView setBackgroundColor:[UIColor redColor]]; [self addSubview:_imageView]; _label = [[UILabel alloc]init]; [_label setBackgroundColor:[UIColor blueColor]]; [self addSubview:_label]; } return self;}
- 第二步:在layoutSubviews方法中设置子控件的frame(一定要调用super的layoutSubviews)
// 这个方法专门用来布局子控件,一般在这里设置子控件的frame// 当控件本身的尺寸发生改变的时候,系统会自动调用这个方法- (void)layoutSubviews{ [super layoutSubviews]; CGFloat viewW = self.frame.size.width; CGFloat viewH = self.frame.size.height; _imageView.frame = CGRectMake(0, 0, viewW, viewW); _label.frame = CGRectMake(0, viewW, viewW, viewH - viewW);}
- 第三步:增加模型属性,在模型属性set方法中设置数据到子控件
// .h文件,因为要接收数据模型,所以外部要访问/** 模型数据接口*/@property (nonatomic, strong) WQShopData *shopData;// .m实现文件- (void)setShopData:(WQShopData *)shopData{ [self.imageView setImage:[UIImage imageNamed:shopData.icon]]; self.label.text = shopData.name;}
- 在控制器中的向封装的view传入数据模型
// 创建封装好的控件 WQShopView *view = [[WQShopView alloc]init]; // 设置view的frame,会自动调用封装好view的layoutSubviews view.frame = CGRectMake(originalX + (marginX + kImageViewW) * col, originalY + (kImageViewH + kMarginY) *row, kImageViewW, kImageViewH); // 将数据模型传入封装好view的成员属性 view.shopData = self.shopsData[index]; [self.shopsView addSubview:view];
- 当view内部子控件很多,可以封装起来.当在外部创建该view对象,并设置或者修改该控件的frame时,就会自动调用layoutSubviews,这时可以设置修改子控件的frame(这时子控件才会显示,还没数据).
- 在传入模型数据时,会调用数据模型的setter方法,这时设置子控件的数据(子控件显示数据)
- 优化:有些子控件,开始不显示,需要时才显示,这时可以通过懒加载方式,在使用子控件时会调用其getter方法,在里面加载并只加载一次子控件.
#import "WQShopView.h"#import "WQShopData.h"@interface WQShopView ()/**图片*/@property (nonatomic, strong) UIImageView * imageView;/**名字*/@property (nonatomic, strong) UILabel * label;@end@implementation WQShopView- (UIImageView *)imageView{ if (_imageView == nil) { _imageView = [[UIImageView alloc]init]; [_imageView setBackgroundColor:[UIColor redColor]]; [self addSubview:_imageView]; } return _imageView;}- (UILabel *)label{ if (_label == nil) { _label = [[UILabel alloc]init]; [_label setBackgroundColor:[UIColor blueColor]]; [self addSubview:_label]; } return _label;}
0 0
- 自定义View的封装(代码方式)
- 纯代码封装自定义View和XIB封装自定义View的区别
- Android之自定义View的封装
- android 自定义View对Title的封装
- OC笔记 - xib封装view、Delegate、代码自定义高度不一致的cell(2015.2.15)
- 自定义View封装
- IOS xib封装自定义view 的封装步骤
- android自定义view的几种方式
- android中自定义View的方式
- 自定义view的三种方式
- 自定义View的5中滑动方式
- xib自定义view的两种方式
- xib文件的使用与封装自定义view的步骤
- 自定义View的封装和xib文件的使用详解
- 使用xib封装自定义view
- 将xib文件封装一个自定义view的步骤
- 使用xib封装一个自定义view的步骤
- 使用xib封装一个自定义view的步骤
- 【整理】unity3d优化总结篇
- InsertSort
- 海马汽车经销商管理系统技术解析(六)顾客生日祝贺
- Window下安装Redis
- unity3d优化总结篇
- 自定义View的封装(代码方式)
- 设置UILabel背景和文字的透明度(代码和SB两种实现)
- 自定义view封装-用Button显示商品图片和名称
- 第43讲--项目三--成绩统计
- Swift面向对象-枚举
- 读浅墨博客 十五 笔记
- Java经典题目:银行业务调度系统
- 设计模式学习之策略模式:容错恢复机制
- 层次聚类法 hierarchical clustering approach