****************************layoutSubviews************************************

layoutSubviews是UIView中的属性方法,即只要继承于UIView,就可以使用这个方法,这个方法也很强大,以下是他的触发时机:

1、init初始化不会触发layoutSubviews  
2、addSubview会触发layoutSubviews  
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化  
4、滚动一个UIScrollView会触发layoutSubviews  
5、旋转Screen会触发父UIView上的layoutSubviews事件  
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

在这些触发情况下,我们就可以妙用他,比如说改变数据等等,这是个很不错的方法  
而且我们也可以手动调用,即

[self setNeedsLayout];

注意:调用layoutSubviews,也需要调用它的父类方法,即

[super layoutSubviews]

传说如果不调用的话会出现奇怪的问题。

************************************initWithFrame,initWithCoder********************************

从nib中加载对象实例时,init:或initWithFrame:都不会调用。而是调用initWithCoder:怎么理解:
有时候,知道initWithFrame方法如何用,但是木有弄明白initWithFrame方法到底是什么?

1. initWithFrame方法是什么?
initWithFrame方法用来初始化并返回一个新的视图对象,根据指定的CGRect(尺寸)。
当然,其他UI对象,也有initWithFrame方法,但是,我们以UIView为例,来搞清楚initWithFrame方法。
2.什么时候用initWithFrame方法?
简单的说,我们用编程方式申明,创建UIView对象时,使用initWithFrame方法。
在此,我们必须搞清楚,两种方式来进行初始化UIView。
1.使用 Interface Builder 方式。
这种方式,就是使用nib文件。通常我们说的“拖控件” 的方式。
实际编程中,我们如果用Interface Builder 方式创建了UIView对象。(也就是,用拖控件的方式)
那么,initWithFrame方法方法是不会被调用的。因为nib文件已经知道如何初始化该View。(因为,我们在拖该view的时候,就定义好了长、宽、背景等属性)。
这时候,会调用initWithCoder方法,我们可以用initWithCoder方法来重新定义我们在nib中已经设置的各项属性。
这就是为什么使用initWithCoder:的原因,因为BIDViewController.xib的view是BIDQuartzFunView类型,而不是UIView类型了,所以其实是从nib中加载对象实例。
2.使用编程方式。
就是我们声明一个UIView的子类,进行“手工”编写代码的方式。
实际编程中,我们使用编程方式下,来创建一个UIView或者创建UIView的子类。这时候,将调用initWithFrame方法,来实例化UIView。
特别注意,如果在子类中重载initWithFrame方法,必须先调用父类的initWithFrame方法。在对自定义的UIView子类进行初始化操作。
比如:

- (id)initWithFrame:(CGRect)frame{

self = [super initWithFrame:frame];// 先调用父类的initWithFrame方法

if (self) {

// 再自定义该类(UIView子类)的初始化操作。

_scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];

[_scrollView setFrame:CGRectMake(0, 0, 320, 480)];

_scrollView.contentSize = CGSizeMake(320*3, 480);

[self addSubview:_scrollView];

}

return self;

}

在这里,我想,应该对initWithFrame方法略知一二了。

当我们所写的程序里没用用Nib文件(XIB)时,用代码控制视图内容,需要调用initWithFrame去初始化

- (id)initWithFrame:(CGRect)frame

{

if (self =[superinitWithFrame:frame]) {

// 初始化代码

}

return self;

}

用于视图加载nib文件,从nib中加载对象实例时,使用 initWithCoder初始化这些实例对象

- (id)initWithCoder:(NSCoder*)coder

{

if (self =[superinitWithcoder:coder]) {

// 初始化代码

}

return self;

}

1.initWithCoder: 对于.xib,当你嵌入一个视图对象到xib,视图加载时默认调用的是该方法;例如:假如创建的view来自nib,那么将会调用initWithCoder,由系统来调用,自己不能调用。
2.initWithFrame: 非.xib的手动编码,视图加载时默认调用的是该方法。是由自己调用,来初始化对象的

转载于:https://www.cnblogs.com/yintingting/p/4540224.html

UIView的layoutSubviews,initWithFrame,initWithCoder方法相关推荐

  1. UIView的layoutSubviews和drawRect方法何时调用

    UIView的layoutSubviews和drawRect方法何时调用   转自:http://jianyu996.blog.163.com/blog/static/1121145552013051 ...

  2. UIView的layoutSubviews和drawRect

    本文转载至 http://my.oschina.net/megan/blog/143027 UIView的setNeedsDisplay和setNeedsLayout方法.首先两个方法都是异步执行的. ...

  3. 谈谈UIView的几个layout方法-layoutSubviews、layoutIfNeeded、

    2019独角兽企业重金招聘Python工程师标准>>> 从百度上搜索了一下layoutSubviews的用处,以下是搜索的结果,当然,笔者是会一一验证的. 1. init初始化不会触 ...

  4. UIView及其分类的属性方法定义

    UIView是iOS开发中最熟悉的控件,不是因为它用得多,而是很多UI控件都是继承它的,了解它的分类方法是很有必要的. UIView其实是由多个分类构成,主要有如下几个分类: UIView :基本属性 ...

  5. initWithFrame,initWithCoder,awakeFromNib的区别

    这三个都是系统初始化视图时会调用的方法. initWithFrame主要用在非xib创建的视图 initWithCoder和awakeFromNib主要用在xib创建的视图    两个调用的先后顺序是 ...

  6. UIView的hitTest和pointInside方法

    官方描述 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event; Returns a Boolean value indicati ...

  7. [ios2] UIView的hitTest,pointInside方法详解【转】

    关于UIView的触摸响应事件中,这里有一个常常容易迷惑的方法hitTest:WithEvent.先来看官方的解释:This method traverses the view hierarchy b ...

  8. iOS开发基础知识--碎片27

     iOS开发基础知识--碎片27 1:iOS中的round/ceil/floorf extern float ceilf(float); extern double ceil(double); ext ...

  9. initWithFrame 与 initWithCoder 、awakeFromNib 的方法理解笔记

    1. initWithFrame方法是什么? initWithFrame方法用来初始化并返回一个新的视图对象,根据指定的CGRect(尺寸). 当然,其他UI对象,也有initWithFrame方法, ...

  10. IOS中initWithFrame 和 initWithCoder的区别

    2019独角兽企业重金招聘Python工程师标准>>> 从nib中加载对象实例时,init:或initWithFrame:都不会调用.而是调用initWithCoder:怎么理解: ...

最新文章

  1. 人工智能/云原生/数据科学/计算等方向内容整理志愿者招募了!
  2. 《JavaScript面向对象精要》——第1章 原始类型和引用类型1.1 什么是类型
  3. linux 每日学一点《Linux架设代理服务器(2)》
  4. bzoj 3223: Tyvj 1729 文艺平衡树
  5. python程序多次运行_[Python]在一段Python程序中使用多次事件循环
  6. poj 1703(种类并查集)
  7. 计算机组成原理【随堂练习】
  8. mysql 原来用的引擎_MySQL 的常用引擎
  9. Excel VBA 删除 表格中的图片
  10. 人人都有个Handler原理讲解
  11. mysql人物画像_用户画像智能匹配,用户画像的算法有哪些?
  12. 去掉Win7快捷方式小箭头
  13. linux 内存容量换算,Hi3516A开发--内存换算
  14. 获取win10锁屏壁纸
  15. Google全系列产品不再信任赛门铁克某款根证书-转载
  16. undefined reference to 'function'及解决办法
  17. Hadoop 文件系统与 COS 之间的数据迁移
  18. Linux基础 第三节 第一课
  19. java try with_Java使用try-with
  20. html来自网页的消息,win7系统ie浏览器提示:来自网页的消息的解决方法

热门文章

  1. pandas常用函数总结
  2. 【笔记+总结】Andrew Ng-神经网络和深度学习
  3. 用caffe训练测试自己的图片
  4. 配置mysql字符_mysql字符设置
  5. mysql number decimal_Oracle中的decimal与Number区别
  6. 机器学习 python 随机抽样random sampling 代码
  7. 多版本并发控制MVCC和乐观锁OCC 是什么 区别
  8. Zookeeper是什么
  9. Ubuntu如何修改用户密码
  10. 2020北京师范大学计算机考研,北京师范大学2021考研初试经验