iOS边练边学--view的封装
一、view封装的思路:
*如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部的子控件的创建屏蔽起来,不让外界关心
*外界可以传入对应的模型数据给view,view拿到模型数据后给内部的子控件设置对应的数据
二、封装控件的基本步骤--四步
1>添加子控件(子控件也可通过懒加载实现)
*在initWithFrame:方法中添加子控件,提供便利构造方法 ps--init方法内部会调用initWithFrame:方法,所以说外部调用的时候直接用init调用
@interface ChaosShopView () // 类扩展,定义子控件成员变量,保证封装性
/** 商品图片 */
@property(nonatomic,strong) UIImageView *thingImg;
/** 商品名称 */
@property(nonatomic,strong) UILabel *thingLabel; @end
// 步骤一:重写构造方法,定义需要的子控件 init方法内部会自动调用initWithFrame:方法
- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor redColor];
// 创建图片
UIImageView *image = [[UIImageView alloc] init];
image.backgroundColor = [UIColor blueColor];
_thingImg = image; // 创建标签
UILabel *label = [[UILabel alloc] init];
label.backgroundColor = [UIColor orangeColor];
label.textAlignment = NSTextAlignmentCenter;
label.font = [UIFont systemFontOfSize:];
_thingLabel = label; [self addSubview:label];
[self addSubview:image]; }
return self;
}
2>设置子控件的尺寸
*在layoutSubviews方法中设置子控件的frame(一定要调用super的layoutSubviews)。不在构造方法中设置子控件尺寸的原因是:子控件的尺寸可能会用到父类的尺寸,在构造函数中父类的frame属性不一定有值,从而导致子控件的frame属性值也会为0。layoutSubviews方法的触发是当父类控件的frame属性发生改变的时候触发!
// 步骤二:重写layoutSubviews方法,父控件尺寸改变时调用该方法。父控件有了尺寸再设置子控件的尺寸
// 注意的是:一定调用父类的layoutSubviews方法
- (void)layoutSubviews
{
// 一定调用父类的方法
[super layoutSubviews];
// 一般在这个方法里设置子控件的尺寸
CGFloat width = self.frame.size.width;
CGFloat height = self.frame.size.height;
self.thingImg.frame = CGRectMake(, , width, width);
self.thingLabel.frame = CGRectMake(, width, width, height - width);
}
3>增加模型属性(这个不要定义在扩展类中了,因为外界需要访问传数据),在模型属性set方法中设置数据到子控件上。
#import <UIKit/UIKit.h>
#import "ShopModel.h" @interface ChaosShopView : UIView /** 数据模型 */
@property(nonatomic,strong) ShopModel *shopModel; // 定义一个类方法
+ (instancetype)shopView; @end
// 步骤三:定义模型成员变量,重写模型的set方法,为子控件加载数据
-(void)setShopModel:(ShopModel *)shopModel
{
// 先给成员变量赋值,把值存起来
_shopModel = shopModel;
[self.thingImg setImage:[UIImage imageNamed:shopModel.icon]];
self.thingLabel.text = shopModel.name;
}
4>可以增加一个类方法,实现快捷开发
声明的代码就不写了,直接写实现的代码吧
+(instancetype)shopView
{
return [[ChaosShopView alloc] init]; // init方法中会调用自己重写的initWithFrame:方法
}
三、创建控件的时候几行代码就搞定
// 类方法快捷创建
ChaosShopView *shopView = [ChaosShopView shopView];
// 设置尺寸
shopView.frame = CGRectMake(bagX, bagY, bagWidth, bagHeight);
// 数据
shopView.shopModel = shopModel;
iOS边练边学--view的封装的更多相关文章
- iOS边练边学--图片的拉伸
图片拉伸方法一: IOS 5.0以后才有的方法: - (void)viewDidLoad { [super viewDidLoad]; UIImageView *imageView = [[UIIma ...
- iOS边练边学--父子控件之作为导航控制器的子类产生的问题以及网易新闻练习
一.导航控制器的子类 作为导航控制器的子类,并且是导航控制器子类中的第一个,系统会默认给子控件添加EdgeInsert属性,把导航栏的宽度挤出来.但是系统只会默认修改第一个. 解决办法1:系统帮忙给第 ...
- iOS边练边学--CALayer,非根层隐式动画,钟表练习
一.CALayer UIView之所以能显示在屏幕上,完全是因为他内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性 ...
- iOS边练边学--xib文件初使用
一.Xib和storyboard对比 *共同点: 1>都用来描述软件界面 2>都用Interface Builder工具来编辑 3>本质都是转换成代码去创建控件 *不同点 1> ...
- iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法
一.NSURLSession.NSURLSessionTask的使用步骤 首先创建NSURLSession对象 通过NSURLSession对象创建对应的任务 <1>NSURLSessio ...
- iOS边练边学--Http网络再学习,简单介绍
一.URL 什么是URL URL中常见的协议 二.Http Http的基本通信过程 发送Http请求的方法 GET 和 POST 对比 GET 和 POST 的选择 三.iOS中的Http学习 iOS ...
- iOS边练边学--多线程练习的多图片下载 以及 使用第三方框架(SDWebImage)的多图片下载
一.自己实现多图片下载应该注意的问题 沙盒缓存的问题 程序缓存的问题 cell重复利用显示图片混乱的问题 -- 用户拖拽快,下载图片慢导致的 解决图片混乱引入NSOperation集合的问题 资源下载 ...
- iOS边练边学--多线程NSOperation介绍,子类实现多线程的介绍(任务和队列),队列的取消、暂停(挂起)和恢复,操作依赖与线程间的通信
一.NSOperation NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加 ...
- iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信
一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码 ...
随机推荐
- PLSQL_统计信息系列07_数据字典统计信息的导出和导入
2014-05-05 Created By BaoXinjian
- Spark与Pandas中DataFrame对比
Pandas Spark 工作方式 单机single machine tool,没有并行机制parallelism不支持Hadoop,处理大量数据有瓶颈 分布式并行计算框架,内建并行机制paral ...
- tp表单的提交与验证
一.控制器如下 引用use app\index\model\User; //注意模型类名不能和控制器类名相同 public function index(){ return $this->fet ...
- JavaScript与DOM(下)
介绍 上一章我们介绍了JavaScript的基本内容和DOM对象的各个方面,包括如何访问node节点.本章我们将讲解如何通过DOM操作元素并且讨论浏览器事件模型. 本文参考:http://net.tu ...
- CSDN日报20170312——《成功人士的七个习惯》
[程序人生]成功人士的七个习惯 作者:liumiaocn 所谓温故而知新.重读往往会带来新的收获,即使没有新的收获,可以带来新的思考也是非常不错.在个人成长的历程中.习惯所扮演的角色不言而喻,Step ...
- 成员函数的重载&&隐藏&&覆盖
/* *成员函数的重载,覆盖,隐藏 *重载: *1.同样的范围(在同一个类中) *2.函数名同样 *3.參数不同 *4.virtualkeyword可有可无 *覆盖是指派生类覆盖基类的函数,特征是: ...
- linux下man手册简介
Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可.Linux 的man手册共有以下几个章节: 1.Standard commands (标准命令)2.S ...
- 查杀病毒的NB命令
kill - `pgrep linux|awk '{++S[$1]}END{for (i in S) print i}'` teamkill #!/bin/bash set -x kill - `pg ...
- Disk performance
http://blogs.msdn.com/b/ntdebugging/archive/2014/12/09/disk-performance-internals.aspx http://blogs. ...
- Spark性能优化指南——基础篇转
前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作 ...