一、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的封装的更多相关文章

  1. iOS边练边学--图片的拉伸

    图片拉伸方法一: IOS 5.0以后才有的方法: - (void)viewDidLoad { [super viewDidLoad]; UIImageView *imageView = [[UIIma ...

  2. iOS边练边学--父子控件之作为导航控制器的子类产生的问题以及网易新闻练习

    一.导航控制器的子类 作为导航控制器的子类,并且是导航控制器子类中的第一个,系统会默认给子控件添加EdgeInsert属性,把导航栏的宽度挤出来.但是系统只会默认修改第一个. 解决办法1:系统帮忙给第 ...

  3. iOS边练边学--CALayer,非根层隐式动画,钟表练习

    一.CALayer UIView之所以能显示在屏幕上,完全是因为他内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性 ...

  4. iOS边练边学--xib文件初使用

    一.Xib和storyboard对比 *共同点: 1>都用来描述软件界面 2>都用Interface Builder工具来编辑 3>本质都是转换成代码去创建控件 *不同点 1> ...

  5. iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法

    一.NSURLSession.NSURLSessionTask的使用步骤 首先创建NSURLSession对象 通过NSURLSession对象创建对应的任务 <1>NSURLSessio ...

  6. iOS边练边学--Http网络再学习,简单介绍

    一.URL 什么是URL URL中常见的协议 二.Http Http的基本通信过程 发送Http请求的方法 GET 和 POST 对比 GET 和 POST 的选择 三.iOS中的Http学习 iOS ...

  7. iOS边练边学--多线程练习的多图片下载 以及 使用第三方框架(SDWebImage)的多图片下载

    一.自己实现多图片下载应该注意的问题 沙盒缓存的问题 程序缓存的问题 cell重复利用显示图片混乱的问题 -- 用户拖拽快,下载图片慢导致的 解决图片混乱引入NSOperation集合的问题 资源下载 ...

  8. iOS边练边学--多线程NSOperation介绍,子类实现多线程的介绍(任务和队列),队列的取消、暂停(挂起)和恢复,操作依赖与线程间的通信

    一.NSOperation NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加 ...

  9. iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信

    一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码 ...

随机推荐

  1. Android开发学习之反编译APK文件

    反编译的目的在于学习一些优秀的Android应用程序代码. 在进行反编译之前,需要准备好下面的软件工具(这些文件都放在同一文件下): 这些工具的下载地址:http://down.51cto.com/d ...

  2. python学习笔记——multiprocessing 多进程组件 进程池Pool

    1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成 ...

  3. selenium+python : Waits---study

    from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.s ...

  4. Unix环境高级编程(一)文件I/O

    Unix系统中大多数文件I/O只需用到五个函数:open.read.write.lseek.close.本章说介绍的I/O是不带缓冲的,即:每个read和write都调用内核中的一个系统调用.不是IS ...

  5. Walkthrough: Writing a Visualizer in C#

    https://msdn.microsoft.com/en-us/library/ms164759.aspx

  6. Linux bash脚本及常用命令--不断更新中

    1.如何在向alias命令传递参数: 这种用法的话就需要使用函数来配合使用. 如要cd到指定目录,并且ls当前目录下的文件可以使用:  alias cdls='cdls(){ cd $1; ls; } ...

  7. web项目,美工和前台配合,页面路径访问问题

    一.美工写页面使用相对路径,但后台使用项目的应用绝对路径,访问时会出现404或页面乱码的问题 目前的解决方法:在页面中添加base标签,指定当前页面默认的路径 base标签:为页面上的所有链接规定默认 ...

  8. mac 安装android sdk

    1.下载sdk http://www.androiddevtools.cn/ 2.解压下载文件到目标文件夹 tar -xzvf android-sdk_r24.4.1-macosx.zip /User ...

  9. spring中AOP

    1 AOP 的功能是把横切的问题(如性能监视.事务管理)模块化.AOP的核心是连接点模型,他提供在哪里发生横切. Spring AOP 的底层是通过使用 JDK 或 CGLib 动态代理技术为目标 b ...

  10. cocos2dx 3.3 场景切出时RenderTexture crash

    在cocos2dx 3.3中下面myScene在切出时会存在概率性崩溃(代码作了最大程度简化,仅为说明问题): class CmyLayer:public Layer{ public: CmyLaye ...