一、自定义构造方法


有时候需要快速创建对象,可以自定义构造方法

  1. + (instancetype)shopView
  2. {
  3. return [[self alloc] init];
  4. }
  5.  
  6. - (instancetype)initWithShop:(NJShop *)shop
  7. {
  8. if (self = [super init]) {
  9. self.shop = shop;
  10. }
  11. return self;
  12. }
  13.  
  14. + (instancetype)shopViewWithShop:(NJShop *)shop
  15. {
  16.  
  17. return [[self alloc] initWithShop:shop];
  18. }

一般情况下自定义一个控件会重写控件的initWithFrame方法, , 因为用户可能通过init方法创建也可能通过initWithFrame方法创建, 为了保证无论用户通过哪一个方法创建都能添加子控件, 所以重写initWithFrame

init方法内部会调用initWithFrame

  1. - (instancetype)initWithFrame:(CGRect)frame
  2. {
  3. if (self = [super initWithFrame:frame]) {
  4.  
  5. NSLog(@"%s", __func__);
  6. // 1.创建一张图片
  7. UIImageView *iv = [[UIImageView alloc] init];
  8. iv.backgroundColor = [UIColor yellowColor];
  9. [self addSubview:iv];
  10. self.iv = iv;
  11.  
  12. // 2.创建一个文本
  13. UILabel *lable = [[UILabel alloc] init];
  14. lable.backgroundColor = [UIColor purpleColor];
  15. lable.textAlignment = NSTextAlignmentCenter;
  16. [self addSubview:lable];
  17. self.lable = lable;
  18. }
  19. return self;
  20. }
  1. NJShopView *shopView = [[NJShopView alloc] initWithFrame:CGRectMake(shopX, shopY, , )];
  2.  
  3. NJShopView *shopView = [NJShopView shopView];
  4.  
  5. NJShopView *shopView = [[NJShopView alloc] initWithShop:self.shops[index]];
  6.  
  7. NJShopView *shopView = [NJShopView shopViewWithShop: self.shops[index]];

二、layoutSubviews


layoutSubviews方法是专门用于布局子控件的位置的

注意: 重写layoutSubviews方法, 一定要调用[super layoutSubviews]方法 \

如果不调用, 会出现一些奇葩的错误

/*

layoutSubviews方法什么时候调用

1.只要创建一个控件, 那么就会调用

2.只要修改控件的尺寸就会调用(bounds/frame)

3.修改位置不会调用

4.如果当前修改的尺寸和上一次的尺寸没有变化, 不会调用

*/

  1. - (void)layoutSubviews
  2.  
  3. {
  4.  
  5. [super layoutSubviews];
  6.  
  7. NSLog(@"%s", __func__);
  8.  
  9. CGFloat shopViewWidth = self.frame.size.width;
  10.  
  11. CGFloat shopViewHeight = self.frame.size.height;
  12.  
  13. // 1.布局图片的位置
  14.  
  15. self.iv.frame = CGRectMake(, , shopViewWidth, shopViewWidth);
  16.  
  17. // 2.布局文本的位置
  18.  
  19. self.lable.frame = CGRectMake(, shopViewWidth, shopViewWidth, shopViewHeight - self.iv.frame.size.height);
  20.  
  21. }

三、Xib文件


什么是Xib?

Xib和Storyboard一样都是用来描述界面的

Xib是Storyboard的前身

Xib是用于描述一个简单的界面或者一个局部的界面

Storyboard是用于描述整体

四、利用Xib自定义View


  1. #import <UIKit/UIKit.h>
  2.  
  3. @class NJShop;
  4. @interface XMGShopView : UIView
  5.  
  6. @property(nonatomic, strong)NJShop *shop;
  7.  
  8. + (instancetype)shopView;
  9. @end
  10.  
  11. #import "XMGShopView.h"
  12. #import "NJShop.h"
  13.  
  14. @interface XMGShopView ()
  15. @property (weak, nonatomic) IBOutlet UIImageView *iconView;
  16. @property (weak, nonatomic) IBOutlet UILabel *nameLabel;
  17. @end
  18.  
  19. @implementation XMGShopView
  20.  
  21. + (instancetype)shopView
  22. {
  23. return [[[NSBundle mainBundle] loadNibNamed:@"XMGShopView" owner:nil options:nil] firstObject];
  24. }
  25.  
  26. - (void)setShop:(NJShop *)shop
  27. {
  28. _shop = shop;
  29.  
  30. self.iconView.image = [UIImage imageNamed:_shop.icon];
  31. self.nameLabel.text = _shop.name;
  32. }
  33.  
  34. @end

xib加载原理:

  1. // 1. 根据custom class创建对象
  2.  
  3. XMGShopView *shopView = [XMGShopView alloc] init];
  4.  
  5. // 2. 根据xib中的设置, 设置控件的相关属性
  6.  
  7. shopView.backgroundColor = [UIColor redColor];
  8.  
  9. shopView.frame = CGRectMake(, , , );
  10.  
  11. // 3. 创建所有子控件, 并且设置子控件的属性
  12.  
  13. UIImageView *iv = [[UIImageView alloc] init];
  14.  
  15. iv.frame = CGRectMake(, , , );
  16.  
  17. UILabel *label = [[UILabel alloc] init];
  18.  
  19. label.frame = CGRectMake(, , , );
  20.  
  21. // 4. 检查子控件是否有连线, 如果有就进行关联
  22.  
  23. self.iconView = iv;
  24.  
  25. self.nameLabel = label;
  26.  
  27. // 5.将所有子控件添加到父控件中
  28.  
  29. [shopView addSubview:iv];
  30.  
  31. [shopView addSubview:label];

iOS开发——UI基础-自定义构造方法,layoutSubviews,Xib文件,利用Xib自定义View的更多相关文章

  1. iOS开发UI基础—手写控件,frame,center和bounds属性

    iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...

  2. IOS开发UI基础--数据刷新

    IOS开发UI基础--数据刷新 cell的数据刷新包括下面几个方面 加入数据 删除数据 更改数据 全局刷新方法(最经常使用) [self.tableView reloadData]; // 屏幕上的全 ...

  3. iOS开发UI篇—无限轮播(循环利用)

    iOS开发UI篇—无限轮播(循环利用) 一.无限轮播  1.简单说明 在开发中常需要对广告或者是一些图片进行自动的轮播,也就是所谓的无限滚动. 在开发的时候,我们通常的做法是使用一个UIScrollV ...

  4. IOS开发UI基础UITableView的属性

    UITableView UITableView内置了两种样式:UITableViewStylePlain,UITableViewStyleGrouped <UITableViewDataSour ...

  5. iOS开发-UI基础Demo

    现在更多的学习资料都是xCode4.X的,发现xCode6.1还是很多东西,如果有正在学习iOS开发的可以通过Demo简单了解下iOS的UI开发~ 1.新建单视图文件: 2.新建项目名称,语言选择OC ...

  6. IOS开发UI基础UIImagePickerController的属性

    UIImagePickerController 1.+(BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType ...

  7. iOS开发——UI基础-懒加载,plist文件,字典转模型,自定义view

    一.懒加载 只有使用到了商品数组才会创建数组 保证数组只会被创建一次 只要能够保证数组在使用时才创建, 并且只会创建一次, 那么我们就称之为懒加载 lazy - (void)viewDidLoad 控 ...

  8. IOS开发UI基础之Plis文件-字典转模型

    什么是plist文件? 在开发中直接将数据写在代码里面 不是一种合理的做法 如果数据经常改变 就需要经常翻开对应的代码进行修改 造成代码扩展性低 因此,可以考虑将经常变的数据放在⽂文件中进⾏行存储,程 ...

  9. iOS开发——UI基础-UIScrollView

    一.UIScrollView使用的步骤 1.创建UIScrollView 2.将需要展示的内容添加到UIScrollView中 3.设置UIScrollView的滚动范围 (contentSize) ...

随机推荐

  1. 国家电力项目SSH搭建

    SSH项目框架搭建总结: 1.建立Web工程 * 导入需要的jar的包 db:连接数据库的驱动包 hibernate:使用hibernate的jar包 jstl:java的标准标签库 junit:测试 ...

  2. Android onLowMemory()和onTrimMemory()

    1. OnLowMemory OnLowMemory是Android提供的API,在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,系统会调用OnLo ...

  3. 转: CvMat,Mat和IplImage之间的转化和拷贝

    1.CvMat之间的复制 //注意:深拷贝 - 单独分配空间,两者相互独立 CvMat* a; CvMat* b = cvCloneMat(a); //copy a to b 2.Mat之间的复制 / ...

  4. Centos7安装Oracle12c

    环境: CentOS7@VMware12,分配资源:CPU:2颗,内存:4GB,硬盘空间:30GB Oracle12C企业版64位 过程纪要: root身份安装依赖包: compat-libstdc+ ...

  5. linux 相关快捷键

    linux 相关快捷键 http://linux.chinaunix.net/begin/2004-10-05/34.shtml#_Toc41417098 1.使用虚拟控制台登录后按“Alt+F2”键 ...

  6. .Net中使用OracleDataAdapter

    本来只想简单记录一下OracleDataAdapter的批量增加和修改用法的,在园子里看到一篇比较详细的就在这分享了(Oracle Data Provider for .NET),虽然用的是 Upda ...

  7. 10月16日下午MySQL数据库CRUD操作(增加、删除、修改、查询)

    1.MySQL注释语法--,# 2.2.后缀是.sql的文件是数据库查询文件. 3.保存查询. 关闭查询时会弹出提示是否保存,保存的是这段文字,不是表格(只要是执行成功了表格已经建立了).保存以后下次 ...

  8. 9月6日表格标签(table、行、列、表头)(补)

    一.<table> <table>代表表格标签.   <table></table> 1.width  表示表格宽度,宽度表达方式有像素和百分比两种.网 ...

  9. GLSL Interface Block参考

    http://www.opengl.org/wiki/Interface_Block_(GLSL) http://stackoverflow.com/questions/9916103/opengl- ...

  10. Nginx报错403 forbidden (13: Permission denied)的解决办法

    由于开发需要,在本地环境中配置了LNMP环境,使用的是Centos 6.5 的yum安装,安装一切正常,但是由于默认网站文件夹比较奇葩,于是把网站文件用mv命令移动到了新的目录,并相应修改了配置文件, ...