自定义View控件(2—手写实例代码)

1、 步骤:

+ 1.自定义一个类继承于UIView
+ 2.在initWithFrame方法中添加子控件
+ 3.在layoutSubviews中设置子控件的位置
+ 4.提供一个属性保存外界传入的数据(模型对象), 重写setter方法设置子控件的数据

- 类工厂方法(便利构造器)
+ 按照苹果的风格和规范, 一般情况一个用于创建对象的对象方法会对应一个类方法
+ 可以通过类工厂方法, 快速的根据数据创建一个对象

- 注意点:
+ 返回值一定要使用instancetype, 不要使用id
+ 在类工厂方法中创建对象, 使用self, 不要使用类名

// **************************************************************************************************

 

2. 实现自定义View:

/* 1. 定义字典模型 */

// 1> 对应plist文件中的模型数据如:Shop

// 2> 在Shop.h中设置属性,然后声明写字典转模型方法如:

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *icon;- (Shop *)initWithDict:(NSDictionary *)dict;
+ (Shop *)shopWithDict:(NSDictionary *)dict; 

// 3> 然后Shop.m中实现Shop.h中的方法:

- (Shop *)initWithDict:(NSDictionary *)dict
{
if (self = [super init]) {
[self setValuesForKeysWithDictionary:dict];
}
return self;
}
+ (Shop *)shopWithDict:(NSDictionary *)dict
{
return [[self alloc] initWithDict:dict];
}

//**************************************************************************************************

/* 2. 定义自定义View,继承UIView,例如:ShopView */

// 1> ShopView.h中设置自定义控件拥有那些类型的子控件,

1. 以及拥有一个模型数据(即将展示到自定义控件上的模型),

2. 以及声明工厂方法,达到快速创建自定义控件及其上的数据模型

// 在ShopView.h

@class Shop;@interface ShopView : UIView@property (nonatomic, weak)UIImageView *iconView;
@property (nonatomic, weak)UILabel *nameView;@property (nonatomic, strong) Shop *shop;- (instancetype)initWithShop:(Shop *)shop;
+ (instancetype)shopViewWithShop:(Shop *)shop;@end

// 2> ShopView.m中:实现.m 中的
1. 实现.h文件中声明的工厂等快速创建自定义控件的方法,

2. 然后因为要设置模型数据和自定义控件上的子控件的数据,所以要重写模型数据的setter方法进行其操作。

3. 因为要实现添加子控件到自定义控件上所以要重写 initWithFrame方法。(因为自定义控件在调用init方法初始化的时候,init方法会调用initWithFrame方法,从而即可将子控件加入到自定义控件上的目的),你也可以选用其他方法来实现增加子控件,而不是必须用initWithFrame才行,只要能达到添加子控件的效果即可。

注意:(不在initWithFrame方法中不要设置其子控件的frame,因为此时自定义控件可能只是做了初始化,而并未设置其frame,所以子控件就无法根据其frame来设置子控件的frame了),

4. 因为要设置自定义控件上子控件的frame,所以要实现其layoutSubViews方法。(layoutSubViews:专门用于设置子控件的frame)

#import "ShopView.h"
#import "Shop.h"@implementation ShopView- (instancetype)initWithShop:(Shop *)shop{if (self = [super init]) {
self.shop = shop;
}
return self;
}+ (instancetype)shopViewWithShop:(Shop *)shop{return [[self alloc] initWithShop:shop];
}- (nonnull instancetype)initWithFrame:(CGRect)frame{if (self = [super initWithFrame:frame]) {
// 1. 子控件imageView创建
UIImageView *subImageView = [[UIImageView alloc] init];
[self addSubview:subImageView];
self.iconView = subImageView;// 2. 子控件lable创建
UILabel *subLable = [[UILabel alloc] init];
subLable.text = self.shop.name;
subLable.textAlignment = UITextAlignmentCenter;[self addSubview:subLable];
self.nameView = subLable;
}
return self;
}- (void)layoutSubviews{
[super layoutSubviews];self.iconView.frame = CGRectMake(0, 0, 70, 70);
self.nameView.frame = CGRectMake(0, 70, 70 , 30);
}- (void)setShop:(Shop *)shop{_shop = shop;
self.iconView.image = [UIImage imageNamed:self.shop.icon];
self.nameView.text = self.shop.name;
}
@end

// **************************************************************************************************

// 3. 在控制器文件中,要做的就是获取模型数据,然后依次将模型数据展示到自定义控件上显示即可。

1. 拥有模型数据
1> 在控制器中设置一个保存模型plist文件中模型数组的属性。
@property (nonatomic, strong) NSArray *shops;

2> 重写shops属性模型的getter方法,从而得到我们想要的模型数组集合,我们可以解析plist文件获取到模型数组。设置模型数组,通过懒加载解析plist文件中数据进行初始化操作即可。

// 懒加载

- (NSArray *)shops{NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil]];
NSMutableArray *shopsArray = [NSMutableArray array];for (NSDictionary *dict in dictArray) {Shop *shop = [Shop shopWithDict:dict];
[shopsArray addObject:shop];
}_shops = shopsArray;return _shops;
}

2. 现在我们即可初始化一个自定义控件出来,然后设置其模型数据,最后将其添加到控制器的view中即可显示

ShopView *shopView = [ShopView shopViewWithShop:self.shops[index]]; // 声明并初始化指定模型的数据到自定义的控件上。

//(你要明白:这句代码将要干什么事情:
// @1:它会调用在shopViewWithShop:从而间接调用init方法,然而在init方法中系统会自动调用initWithFrame方法,所有这时它又会调用initWithFrame方法从而实现了添加子控件到自定义控件上。

// @2:ShopView类的shopViewWithShop:方法 -》对象方法initWithShop:来初始化一个自定义的控件,从而间接调用init方法,然而在init方法中系统会自动调用initWithFrame方法,所有这时它又会调用initWithFrame方法从而实现了添加子控件到自定义控件上。并且将传入的模型将其设置到自定义控件的模型数据属性,这样就会调用其set方法setShop:,在set方法中就会完成,将模型数据展示到控件上展示数据了。


// 4. 计算自定义控件添加到的frame

shopView.frame = CGRectMake(subViewX, subViewY, subViewWidth, 70);

// 5. 将搭建好的自定义控件添加到控制器的view上

[self.view addSubview:shopView];

转载于:https://www.cnblogs.com/cjpBlog/p/4644319.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pojo java_Java——POJO总结

一:什么是POJO“Plain Old Java Object”“简单java对象”。POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。二:为什么会有POJO?主要是Java的开发者被EJB的繁杂搞怕了,…

MATLAB调用C/C++函数的方法

http://item.taobao.com/item.htm?spma1z10.5-c.w4002-9510581626.24.ZO6sko&id43401674106 精通MATLAB混合编程视频讲解 MATLAB各类函数视频讲解 基于MATLAB的高等数学问题求解 MATLAB函数速查视频讲解 面向对象C视频教程 精通MATLAB混编编程demo及PDF QQ&#xff1a…

迁云架构实践

本文着笔介绍IT互联网化为传统企业带来的技术挑战,并对上云架构最佳实践进行了深入介绍,首发于阿里云&《程序员》联合出品的《凌云》杂志。 作者: 王宇德,张文生 云计算作为信息技术领域的一种创新应用模式,自其诞…

最短路最新心得

如果,上面的图,如果用dij算法,那么dist[4] 4, 是得不到正确的结果的, 这个因为dist[3]先被确定是最小,然后用来更新dist[4] 但是存在负权,使得dist[3]更小,但是我们已经把结点3标记为不可用了…

java canvas 缩放图片_java-GWT:放大和缩小画布绘图

我想应用放大和缩小,并在画布上重新绘制对象,以便在最大和最小缩放级别都能获得清晰的视图.我获得了如何执行操作的参考here,因此我已将画布传递给可缩放图像构造函数而不是图像,并按照所有步骤进行操作.我再次在“ mainDraw”方法中重画对象,但没有得到正确的结果.我知道我缺少…

MATLAB中MEX文件的编写与调试

*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com http://item.taobao.com/item.htm?spma1z10.5-c.w4002-9510581626.24.ZO6sko&id43401674106 精通MATLAB混合编程视频讲解 MATLAB各类函数…

数据库设计思考

一:没有完美的数据库设计,只有符合业务的数据库设计! 二:我们的数据库设计,在遵守标准(三大范式)的同时也要考虑客户的体验! 有用户才有天下! 三:数据库设计时…

performSegueWithIdentifier:sender里边的sender是啥意思

performSegueWithIdentifier:sender里边的sender是啥意思啊?怎样用啊? [self performSegueWithIdentifier:"pushSign" sender:self]; [self performSegueWithIdentifier:"pushSign" sender:sender]; [self performSegueWithIdent…

java wrapper怎么运行_如何从智能合约中生成Java Wrapper

在本文中,我们将了解如何直接从智能合约生成Java Wrapper类以与Java中的智能合约进行交互。从智能合约生成Java Wrapper类有不同的方法:1. Web3j命令行工具和solc2. Web3j命令行工具和Truffle构建生成的工件3. web3j-maven-plugin4. web3j-gradle-plugin…

Hive 1.2.1SparkSqoop安装指南

目录 目录 1 1. 前言 1 2. 约定 2 3. 服务端口 2 4. 安装MySQL 2 4.1. 安装MySQL 2 4.2. 创建Hive元数据库 4 5. 安装步骤 5 5.1. 下载Hive 1.2.1二进制安装包 5 5.2. 安装Hive 5 5.3. 安装MySQL-Connector 5 5.4. 修改配置 5 5.4.1. 修改/etc/profile或~/.profile 5 5.4.2. 修…

Matlab与C/C++混合编程调用OpenCV

*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com http://item.taobao.com/item.htm?spma1z10.5-c.w4002-9510581626.24.ZO6sko&id43401674106 精通MATLAB混合编程视频讲解 MATLAB各类函数…

STL--排序与检索

题目 现有N个大理石,每个大理石上写了一个非负整数。首先把各数从小到大排序,然后回答Q个问题。每个问题是否有一个大理石写着某个整数x,如果是,还要回答哪个大理石写着x。排序后的大理石从左到右编写为1-N。(样例中,…

体验LESS CSS 框架

LESS基于NODE.JS的一种框架性语言,它可以更好更快捷的来搭建网站框架结构; 而后LESS 将 CSS 赋予了动态语言的特性,如 变量, 继承,运算, 函数. LESS 既可以在 客户端 上运行 (支持IE 6, Webkit, Firefox)&a…

java添加按钮点击事件_如何为odoo 10中的按钮点击事件添加一个java脚本处理程序?...

我想使用java脚本为header中的按钮创建一个处理程序。下面我视图模型给出:如何为odoo 10中的按钮点击事件添加一个java脚本处理程序?inherit_id"web.assets_backend">rel"stylesheet">my_pet_store_formpetstore.messageformc…

LeetCode(53):Maximum Subarray

Maximum Subarray: Find the contiguous subarray within an array (containing at least one number) which has the largest sum.For example, given the array [−2,1,−3,4,−1,2,1,−5,4],the contiguous subarray [4,−1,2,1] has the largest sum 6. 题意:找…

孩子教育

看了一圈学区房,基本上把浦东各个一流二流学校全看一遍了,大体下来觉得未必非要到一流学校附近买学区房,主要是家庭经济条件不允许,再者我和老公希望孩子在小学培养读书的习惯,而不是天天做试卷。所以一流学校和二流学…

python 程序打包 vscode_使用VScode编写python程序并打包成.exe文件

听说Visual Studio Code(VS Code)的诸多好处,了解了一下果真很喜欢,我喜欢它的缘由主要有3个,一是VS Code开源且跨平台,二是由于其界面很是酷,三是能够知足个人大所属代码需求,除此以外固然还有强大的好奇心…

使用命名空间、头文件和实现文件

*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com *************************************************** 2.3 使用命名空间、头文件和实现文件 使新的throttle类满足程序的需求将是非常…

Permissions for id_rsa are too open

为什么80%的码农都做不了架构师?>>> Last week I was lucky enough to have my laptop upgraded (yay SSD) which meant I needed to configure a new install of OSX Lion. Most of my files are stored online (email, documents, code, etc) but I m…

java看图_看图吧,Java

package salary;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.text.NumberFormat;public class Salary extends JFrame{//声明标签private JLabel numl;private JLabel basel;private JLabel salel;//声明文本框private JTextField numf;priva…