ios晋级之路-layout机制

ios layout机制相关方法

  1. - (CGSize)sizeThatFits:(CGSize)size
  2. - (void)sizeToFit

——————-

  1. - (void)layoutSubviews
  2. - (void)layoutIfNeeded
  3. - (void)setNeedsLayout

——————–

  1. - (void)setNeedsDisplay
  2. - (void)drawRect

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

1、init初始化不会触发layoutSubviews

但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会触发

2、addSubview会触发layoutSubviews

3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化

4、滚动一个UIScrollView会触发layoutSubviews

5、旋转Screen会触发父UIView上的layoutSubviews事件

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

在苹果的官方文档中强调:

You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.

layoutSubviews, 当我们在某个类的内部调整子视图位置时,需要调用。

反过来的意思就是说:如果你想要在外部设置subviews的位置,就不要重写。

刷新子对象布局

-layoutSubviews方法:这个方法,默认没有做任何事情,需要子类进行重写
-setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用
-layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)

如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局

在视图第一次显示之前,标记总是“需要刷新”的,可以直接调用[view layoutIfNeeded]

重绘

-drawRect:(CGRect)rect方法:重写此方法,执行重绘任务
-setNeedsDisplay方法:标记为需要重绘,异步调用drawRect
-setNeedsDisplayInRect:(CGRect)invalidRect方法:标记为需要局部重绘

sizeToFit会自动调用sizeThatFits方法;

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

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

sizeToFit可以被手动直接调用

sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己

———————————-

layoutSubviews对subviews重新布局

layoutSubviews方法调用先于drawRect

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

layoutIfNeeded方法如其名,UIKit会判断该receiver是否需要layout.根据Apple官方文档,layoutIfNeeded方法应该是这样的

layoutIfNeeded遍历的不是superview链,应该是subviews链

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

setNeedDisplay在receiver标上一个需要被重新绘图的标记,在下一个draw周期自动重绘,iphone device的刷新频率是60hz,也就是1/60秒后重绘

时间: 2024-10-29 06:22:49

ios晋级之路-layout机制的相关文章

ios晋级之路-本地存储

首先应该知道ios开发是在沙盒中开发的,对一些部分的文件的读写进行了限制,只能在几个目录下读写文件 (1)Document:应用中用户数据可以放在这里,ITunes备份和恢复的时候会包括此目录 (2)tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除 (3)Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出后删除 写入Document文件时有两个类NSDocumentDirectory ,NSDocument

ios晋级之路-动画CABaseAnimation

想在CALayer中实现动画很容易,初学者可能会把思想局限于UIView层面上,其实不放用CALayer会比你想象的简单且思路清晰,上篇随笔中讲到了CALayer的一些属性,如果说你改变一些属性比如bounds,position你会发现它是会自带隐式动画的,而且效果不错,不过在这里你不能自定义动画事件并且让一组动画有效的执行.如果想实现上述的效果就需要CABaseAnimation //显示动画 CABasicAnimation * contentAnimation = [CABasicAnim

ios晋级之路-强引用和弱引用

在objective-c的ARC模式中,请看以下代码 id objc =[[NSObject alloc]init]; 这里id默认为强引用 在强引用中,有时会出现循环引用的情况,这时就需要weak来帮忙啦 int main(int argc, const char * argv[]) { id __weak obj0 = nil; @autoreleasepool { if (YES) { id obj1 = [[NSObject alloc]init]; obj0 = obj1; NSLog

ios 晋级之路- block深入

最近在写代码的时候感觉block有的时候真的很好用,传值.传递消息跟代理通知比起来真的是很快,特别是一些空间的点击事件回调函数 int (^myBlock)(int) = ^(int num){ return num; }; NSLog(@"%d",myBlock(3)); 其实定义一个block变量,就相当于定义了一个函数.但是区别也比较明显,以上面代码为例,在执行myBlock时并不会执行Block{}内部的代码,儿myBlock(3)才会执行{}内部的代码,这点跟函数很像 _bl

ios晋级之路-tableViewCell设置背景颜色

如果你项修改一下cell的颜色的话cell.contentView.backgroundColor = [UIColor redColor]; 这样是没有问题的,但是如果你想把其修改成无色,那么就不可以了. 所以 为了改变单元格的背景色,你需要修改: 1 2 3 4 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)

ios -晋级之路 如何去掉tableView多余行的横线

大家可能会遇到这种问题,就是我本来要用三行表格但是设置好之后,下面有出现了好多的横线~~~~orz 这种方法可以解决问题 UIView * view = [[UIView alloc]init]; view.backgroundColor = [UIColor clearColor]; [self.tableView setTableFooterView:view];

iOS狂暴之路---视图控制器(UIViewController)使用详解

一.前言 在之前的一片文章中已经介绍了 从iOS的第一个应用中能学习到哪些知识点 在那篇文章中主要介绍了一个iOS程序的启动过程和应用的几大对象,以及应用的生命周期,同时也介绍了应用中的控制器知识点,介绍了其生命周期方法,那么对于一个iOS应用一般都是会包含多个页面,而每个页面就是一个控制器,一个控制器一般都是关系到一个UIView的,但是我们在真正使用这些控制器的时候会发现,多个页面之间的跳转关系该如何控制.在之前的文章知道一个应用对应一个窗口对象UIWindow,每个窗口都有一个根控制器对象

IOS学习之路--OC的基础知识

运行过程 1.编写OC程序:.m源文件 2.编译.m文件为.o目标文件:cc -c xxxx.m 3.链接.o文件为a.out可执行文件:cc xxxx.o -framework Foundation 4.执行a.out文件:./a.out #import 的功能跟#include一样,只是更好用,他避免了头文件的多次包含 为了能使用OC的特性, 一定要引入#import <Foundation/Foundation.h> 类定义// @implementation 和 @end // 设计(

iOS开发之Auto Layout入门

随着iPhone6与iOS8的临近,适配的问题讲更加复杂,最近学习了一下Auto Layout的使用,与大家分享.  什么是Auto Layout? Auto Layout是iOS6发布后引入的一个全新的布局特性,其目的是弥补以往Autoresizing在布局方面的不足之处,以及未来面对更多尺寸适配时界面布局可以更好的适应. 为什么要用Auto Layout? Autolayout能解决不同屏幕(iPhone4,iPhone5,iPad...)之间的适配问题. 在iPhone4时代开发者只需要适