用途 : 一个View内部的子控件比较多的时候可以自定义一个View,把它内部的子控件屏蔽起来(就像苹果的导航栏上面的UIBarButton,你是通过BarButtonitem来修改显示的内容)

1.重写 initWithFrame 和 awakeFromNib(一般两个都要写),然后在写一个初始化的方法,在初始化方法中添加子控件和初始化子控件(当然也可以使用懒加载的方式来初始化子控件)

2.在layoutSubviews方法中调整子控件的位置和尺寸

3.提供一个模型属性,让外界来设置显示的内容

效果图: 

(当然这种效果也可以通过自定义Button来实现)

代码实现懒加载的方式(使用懒加载的好处是可以单独方法中设置子控件的属性,这样业务更加清晰)

文件有 : KFShopView和 KFShop

/*************** KFShop.h文件 ***************/

@interface KFShop : NSObject

@property (copy, nonatomic) NSString * name;

@property (copy, nonatomic) NSString * icon;

// 提供一个方法用于字典转模型

// 开发中我们要面对模型开发,而不是面对字典开发.例如 属性名如果写错了,编译器马上报错.如果是使用字典,写错了编译器并不会报错

- (instancetype)initWithDict:(NSDictionary *)dict;

+ (instancetype)shopWithDict:(NSDictionary *)dict;

@implementation KFShop

- (instancetype)initWithDict:(NSDictionary *)dict

{

if(self = [super init])

{

self.name = dict[@"name"];

self.icon = dict[@"icon"];

}

return self;

}

+ (instancetype)shopWithDict:(NSDictionary *)dict;

{

return [[self alloc] initWithDict:dict];

}

@end


/*************** KFShopView文件 ***************/

#import <UIKit/UIKit.h>

@class KFShop;

@interface KFShopView : UIView

@property (strong, nonatomic) KFShop *shop;

+ (instancetype)shopView;

@end

@interface KFShopView()

@property (weak, nonatomic) UIImageView * imageView;

@property (weak, nonatomic) UILabel * nameLabel;

@end

@implementation KFShopView

// 提供一个类方法用来快速创建shopView
+ (instancetype)shopView{KFShopView *shopView = [[self alloc] init];return shopView;}// 用到时才会创建imageView
- (UIImageView *)imageView{if(_imageView == nil){UIImageView * imageVeiw = [[UIImageView alloc] init];_imageView = imageVeiw;[self addSubview:_imageView];}return _imageView;}// 用到时才会创建nameLabel
- (UILabel *)nameLabel
{if(_nameLabel == nil){UILabel * label = [[UILabel alloc] init];_nameLabel = label;label.font = [UIFont systemFontOfSize:14];label.textAlignment = NSTextAlignmentCenter;[self addSubview:_nameLabel];}return _nameLabel;}// 根据传进来的模型设置显示的内容
- (void)setShop:(KFShop *)shop
{_shop = shop;self.imageView.image = [UIImage imageNamed:self.shop.icon];self.nameLabel.text = shop.name;
}// 布局子控件
- (void)layoutSubviews
{// 一定要调用super的方法
    [super layoutSubviews];CGFloat W = self.frame.size.width;CGFloat H = self.frame.size.height;self.imageView.frame = CGRectMake(0, 0, W, W);self.nameLabel.frame = CGRectMake(0, W, W, H - W);
}

转载于:https://www.cnblogs.com/TangKaiFu/p/4620049.html

自定义View步骤学习笔记相关推荐

  1. Java中如何创建自定义的注解学习笔记(MD版)

    概要 Java中如何创建自定义的注解学习笔记(MD版). 博客 博客地址:IT老兵驿站. 前言 记得这篇笔记还是在泉州的龙玲酒店记录的,是一个周六的晚上,坐飞机从上海到泉州,从笔记中能勾起一些旅游的回 ...

  2. Android开发,自定义View的学习合集

    转载自:http://blog.csdn.net/u011507982/article/details/51199644 自定义控件学习  https://github.com/GcsSloop/An ...

  3. 使用Metasploit对MSSQL渗透测试步骤——学习笔记

    学习笔记 使用metasploit对MSSQL渗透测试方法(因为本人靶机没有mssql服务,所以只有方法hh) 第一步,使用mssql_ping获取信息 Name: MSSQL Ping Utilit ...

  4. 自定义view初学习(仿小米闹钟)

    我是第一次打自定义view相关代码,说错了大家请多多包涵 首先前导知识是自定义view创建时候要重写的方法onMeasure确定相当于父容器当前自定义view的位置 onDraw  用Canvas.曲 ...

  5. 强大的DataGrid组件[7]_自定义DataGrid——Silverlight学习笔记[15]

    今天我们来一起学习怎样自定义DataGrid的单元格呈现形式的基本操作方法. 基本知识讲解   1)两种状态 DataGrid的单元格的状态有两类,即编辑状态和非编辑状态. 在实际开发中,如果一个单元 ...

  6. 自定义View的学习(一)

    一.简述: VIew和ViewGroup是一切控件的父类,ViewGroup也继承自View. 二.基本知识: 1.Android坐标系:屏幕左上角为原点,原点向右和向下分别是X.Y轴正方向 2.Vi ...

  7. c++ map 自定义排序_Java学习笔记:Map集合介绍

    在介绍它之前先来看看再API文档中是如何介绍它的,看图片: 由图片可以看出,Map属于双列集合,每次可以添加一对数据,并且这两个数据具有映射关系. 单列集合和双列集合区别 一.Map继承体系 1.Ha ...

  8. jQuery 自定义事件的学习笔记

    jquery中提供了两种方法可以绑定自定义事件: bind()和one() 而绑定的自定义事件的触发,必须得用jquery中的 trigger()方法才能触发. 我们先来看on事件  代码如下 复制代 ...

  9. android自定义指南针罗盘学习笔记

    1.需求分析 略 这种纯图形的罗盘,首先考虑的是用继承View的方式,画圆 画刻度 画方向 画度数 2.代码实现 a.xml <?xml version="1.0" enco ...

最新文章

  1. 告别排队!用Python定时自动挂号和快捷查询化验报告
  2. python中的time库安装步骤-python中time模块怎么用
  3. ZOJ 3798--解题报告
  4. 0226互联网新闻 | “多闪”上线首月iOS下载量超过500万;阿里云MWC 2019发布7款新产品...
  5. linux目录结构简析
  6. vue-cli 上手
  7. 修改输入框placeholder的默认样式
  8. JSON 和 JavaScript 对象互转
  9. 开源游戏引擎_Hatchit:开源游戏引擎
  10. OpenShift 4.3 - 基于虚拟机的BareMetal离线安装(Shell说明)
  11. normalize函数_【ADAMS】矩阵/数组函数
  12. 东航期货模拟交易brockerid(期货公司的客户号)
  13. 拆分php中 $i++ ++$i PHP中的i++与++i的区别及效率
  14. vs2019 + vcpkg安装OpenSSL
  15. libtersafe文件下载_tersafe.dll官方版下载
  16. Android App的破解技术有哪些?如何防止反编译?
  17. 单片机应用系统设计技术——串行口方式0 拓展并行输出端口 02 74LS164芯片
  18. HMC5883L磁力计使用
  19. APQ:联合搜索网络架构、剪枝和量化
  20. linux卸载LILO命令,Linux lilo命令

热门文章

  1. forkjoin rxjs_如何通过吃披萨来理解RxJS运算符:zip,forkJoin和Combine
  2. aws fargate_我如何在AWS Fargate上部署#100DaysOfCloud Twitter Bot
  3. 15-5重构_重构-糟糕,我一直在向后做。
  4. 面试时与人事交谈时间_如何与您的技术负责人交谈并解决通讯故障
  5. 我开发的代码,如何申请版权_代码简介:我花了3个月时间申请开发人员职位。 这是我学到的。...
  6. mysql查询解析过程_MySQL查询执行过程详解
  7. 山东计算机类好的民办大学,山东四大坑人学校-山东坑人的民办大学(野鸡大学)...
  8. (C++)1027 打印沙漏
  9. 安装Python第三方库的三个方法
  10. 北京学习Java培训有哪些比较好