****************************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的手动编码,视图加载时默认调用的是该方法。是由自己调用,来初始化对象的

UIView的layoutSubviews,initWithFrame,initWithCoder方法的更多相关文章

  1. UIView的layoutSubviews和drawRect方法

    UIView的layoutSubviews和drawRect方法   首先两个方法都是异步执行.layoutSubviews方便数据计算,drawRect方便视图重绘.   layoutSubview ...

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

    首先两个方法都是异步执行.layoutSubviews方便数据计算,drawRect方便视图重绘. layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSubvi ...

  3. UIView的layoutSubviews和drawRect方法何时调用 ———转

    转自:http://jianyu996.blog.163.com/blog/static/112114555201305113018814/ 首先两个方法都是异步执行.layoutSubviews方便 ...

  4. OC--init,initialize,initWithCoder:,initWithFrame:各方法的区别和加载顺序

    1.先把OC的类分清楚各有什么方法 普通类的方法 init initialize: 控制器类的方法 init initialize: initWithCoder: UI控件类的方法 init init ...

  5. UIView的几个layout方法

    iOS layout的相关方法: 1,layoutSubviews 2,layoutIfNeeded 3,setNeedsLayout 4,setNeedsDisplay 5,drawRect 6,s ...

  6. UIView的layoutSubviews和drawRect

    原文: UIView的layoutSubviews和drawRect UIView的setNeedsDisplay和setNeedsLayout方法.首先两个方法都是异步执行的.setNeedsDis ...

  7. 谈谈UIView的几个layout方法

    谈谈UIView的几个layout方法-layoutSubviews.layoutIfNeeded.setNeedsLayout...   最近在学习swift做动画,用到constraint的动画, ...

  8. UIView背景渐变三种方法

    //此作品非原创 #import "ACViewController.h" @interface ACViewController () @end @implementation  ...

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

    最近在学习swift做动画,用到constraint的动画,用到layoutIfNeeded就去研究了下UIView的这几个布局的方法. 下面是做得一个动画,下载地址:https://github.c ...

随机推荐

  1. aws部署从无到有(二)windows管理aws

    1 AMI正常启动后会进入下面页面 2 远程链接点击如何连接至您的 Linux 实例进入下载页 Windows下使用 PuTTY连接到 Linux 实例 http://www.chiark.green ...

  2. jquery 实现 点击一个按钮添加多个div

    <script type="text/javascript"> var blockNum=10; $(document).ready(function(){ var p ...

  3. 屏幕坐标和世界坐标的转换+对象池技术(3D打地鼠小游戏)

    游戏中可能经常会遇到需要某个物体跟着鼠标移动,然后又需要把物体放在某个鼠标指定的位置 实现方式 Camera.main.WorldToScreenPoint Camera.main.ScreenToW ...

  4. HttpServletResponse应用----生成验证码

    1.1生成随机图片用作验证码 生成图片主要用到BufferedImage类 package gacl.response.study;import java.awt.Color;import java. ...

  5. 批量去除office超链接

    mac下: fn+shift+comman+F9 windows下:control+shift+F9

  6. 笨方法学python--读文件

    1 raw_input()的另外用法 prompt = '> ' likes = raw_input(prompt) 提示符> 可以不用每次输入,要修改,只修改一个地方. 2 读取文件 t ...

  7. ubuntu/linux 下 git 通过代理下载数据 (最简单的方式)

    git国内访问较慢,走代理较快. 方法:git config --global http.proxy http://proxyuser:proxypwd@proxy.server.com:port_n ...

  8. C# 16位的GUDI

    引用:  http://www.cnblogs.com/lcwzj/archive/2009/04/16/1436992.html 当我们想要获得一个唯一的key的时候,通常会想到GUID.这个key ...

  9. RESTful架构3--开发实战

    转自:REST服务开发实战 如果要说什么是REST的话,那最好先从Web(万维网)说起. 什么是Web呢?读者可以查看维基百科的词条(http://zh.wikipedia.org/zh-cn/Web ...

  10. html 细线表格

    可以<table width="800px" cellpadding="0" border="1px" style="bor ...