UIView的几个layout方法

iOS layout的相关方法:

1,layoutSubviews

2,layoutIfNeeded

3,setNeedsLayout

4,setNeedsDisplay

5,drawRect

6,sizeThatFits

7,sizeToFit

大概有以上几个。

一,layoutSubviews

这个方法,默认没有做任何事情,需要子类进行重写。layoutSubviews会在以下情况下被调用:

1,init初始化不会触发layoutSubviews,如果设置了不为CGRectZero的frame的时候会被调用。

2,addSubview会触发layoutSubviews。

3,设置view的frame的时候会被调用,当然前提是frame的值设置前后发生了变化。

4,滚动一个UIScrollView会触发layoutSubviews事件。

5,旋转Screen会触发父UIView上layoutSubviews。

6,改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。

7,直接调用setLayoutSubviews。

不建议直接调用layoutSubviews方法。

二,setNeedsLayout

标记为需要重新布局,不立即刷新,但是layoutSubviews在合适的时机一定会被调用。

三,layoutIfNeeded

如果有layoutIfNeeded标记的刷新,立即调用layoutSubviews进行重新布局。

对于一组动画而言,不管有多少约束改变,只需在动画里执行一次layoutIfNeeded,所有的都会以动画的方式。如果一些变化不想动画,在动画之前执行layoutIfNeeded。

四,drawRect

这个方法用来重绘。

drawRect在以下情况下会被调用:

1,如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。drawRect调用是在controller->loadView,controller->viewDidLoad两个方法之后调用的,所以不用担心在控制器中,这些view的drawRect就开始画了。这样可以在控制器中设置一些值给view(如果这些view在draw的时候需要用到某些变量值)。

2,该方法在sizeToFit后被调用,所以可以先调用sizeToFit计算出size,然后系统自动调用draRect方法。

3,通过设置contentMode属性值为UIViewConentModeReDraw。那么将在每次设置或者更改frame的时候会自动调用drawRect方法。

4,直接调用setNeedsDisplay,活着setNeedsDisplayInRect:触发drawRect方法,但是前提条件是rect不能为0 。

以上1,2推荐,3,4不推荐。

drawRect方法使用注意点:

1,若使用UIView绘图,只能在drawRect方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate的ref并且不能够用于绘图。drawRect不能手动显示调用,必须通过调用setNeedsDisplay或者setNeedsDisplayInRect让系统自动调用该方法。

2,若使用calayer绘图,只能在drawInContext中(类似于drawRect)绘制,或者在delegate中的相应方法绘制,同样也是调用setNeedDisplay等间接调用以上方法。

3,若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来调用setNeedsDisplay实时刷新屏幕。

五,sizeToFit

1,sizeToFit会自动调用sizeThatFits方法。

2,sizeToFit不应该在子类中被重写,应该重写sizeThatFits

3,sizeThatFits传入的参数是receiver当前的size,返回一个适合的size。

4,sizeToFit可以被手动调用直接调用,sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己。

补充:

1,layoutSubviews对subviews重新布局

2,layoutSubviews方法调用优先于drawRect

3,setNeedsLayout在receiver标记上一个需要重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviews

4,layoutIfNeeded方法如其名,UIKit会判断该receiver是否需要layout。

5,layoutIfNeeded遍历的不是superviews链,而是subviews链。

6,drawRect是对receiver的重绘,能获得context

7,setNeedsDisplay在receiver 上标上一个需要被重新绘制的标记,在写一个draw周期自动绘制。iPhone device的刷新频率是60z,也就是1/60s后重新绘制。

8,UIView的setNeedsDisplay和setNeedsLayout方法区别:

首先,这两个方法都是异步调用的。

其次,

setNeedsDisplay会自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。

setNeedsLayout会默认调用layoutSubViews,这样就可以处理视图。

综上所述,setNeedsDisplay方便绘图,setNeedsLayout方便出数据。

时间: 2024-08-07 00:14:26

UIView的几个layout方法的相关文章

Android的onLayout、layout方法讲解

http://www.2cto.com/kf/201404/291740.html onLayout方法是ViewGroup中子View的布局方法,用于放置子View的位置.放置子View很简单,只需在重写onLayout方法, 然后获取子View的实例,调用子View的layout方法实现布局.在实际开发中,一般要配合onMeasure测量方法一起使用. onLayout方法: ? 1 2 3 @Override protected abstract void onLayout(boolean

UIView的setNeedsDisplay和setNeedsLayout方法

1,UIView的setNeedsDisplay和setNeedsLayout方法 首先两个方法都是异步执行的.而setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到  UIGraphicsGetCurrentContext,就可以画画了.而setNeedsLayout会默认调用layoutSubViews, 就可以  处理子视图中的一些数据. 综上所诉,setNeedsDisplay方便绘图,而setNeedsLayout方便出来数据. layoutSubviews在

UIView的layoutSubviews和drawRect方法何时调用

首先两个方法都是异步执行.layoutSubviews方便数据计算,drawRect方便视图重绘. layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSubviews. 2.addSubview会触发layoutSubviews. 3.设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化. 4.滚动一个UIScrollView会触发layoutSubviews. 5.旋转Screen会触发父UIView上的

UIView的layoutSubviews和drawRect方法

UIView的layoutSubviews和drawRect方法 首先两个方法都是异步执行.layoutSubviews方便数据计算,drawRect方便视图重绘. layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSubviews.2.addSubview会触发layoutSubviews.3.设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化.4.滚动一个UIScrollView会触发layoutSu

iOS之layout方法-layoutSubviews、layoutIfNeeded、setNeedsLayout

下面列举下iOS layout的相关方法: layoutSubviews layoutIfNeeded setNeedsLayout setNeedsDisplay drawRect sizeThatFits sizeToFit 大概常用的上面几个 , 具体的应该还有别的. layoutSubviews 这个方法,默认没有做任何事情,需要子类进行重写 . 系统在很多时候会去调用这个方法: 1.初始化不会触发layoutSubviews,但是如果设置了不为CGRectZero的frame的时候就会

UIView的常见属性和方法

- (void)viewDidLoad { [super viewDidLoad]; // 临时View UIView *temp = [[UIView alloc] init]; temp.frame = CGRectMake(0, 0, 100, 100); [self.view addSubview:temp]; //UIView的常见属性 //1. 获得自己的父控件 [temp superview]; //2. 获得自己所有的子控件对象 [temp subviews]; //3. 控件的

【iOS7的一些总结】使用UIView的一种有效方法

在一个典型的MVC结构中,Model部分负责保存目标数据,View部分主要负责实现数据的界面以及将数据显示出来,二者在Controller的操作下协同工作.在iOS应用中,View的实现主要由UIView及其派生类实现,主要由UILabel.UIImageView等等类来显示不同的信息. 这里展示一个demo来说明个人对UIView同数据交互的一种观点,个人意见仅供参考,欢迎讨论. 1.首先建立一个UIView的子类用于定制我们的视图对象. 头文件: #import <UIKit/UIKit.h

UIView的常用属性和方法

@start 今天练习的是UIView的常用属性,首先应该新建一个窗口和相应的根视图控制器 1 //新建一个窗口和根视图控制器 2 self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; 3 4 //设置视图控制器 5 UIViewController *controller = [[UIViewController alloc]init]; 6 self.window.rootViewControl

UIView的drawRect和layoutSubviews方法

注意三点: 1.两个方法都是异步执行的 2.使用init初始化UIView两个方法都不会调用,所以在init中最好是初始化数据,而在上述两个方法中初始化视图 3.最好使用drawRect初始化视图,layoutSubviews在继承UIScrollView或UITableView等情况下,会调用两次 MyView.h @interface MyView : UIView @end MyView.m #import "MyView.h" @implementation MyView -