1、layoutSubviews方法

  • 1.1 根据苹果官方帮助文档对layoutSubviews方法的解释:

    • 此方法用来重新定义子元素的位置和大小。当子类重写此方法,用来实现UI元素的更精确布局。如果要让布局重新刷新,那么就调用setNeedsLayout,即setNeedsLayout方法会默认用layoutSubViews方法。
  • 1.2 很多时候系统会自动调用layoutSubviews方法:

    • 1.初始化不会触发layoutSubviews,但是如果设置了不为CGRectZero的frame的时候就会触发。
    • 2.addSubview会触发layoutSubviews
    • 3.设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
    • 4.滚动一个UIScrollView会触发layoutSubviews
    • 5.旋转Screen会触发父UIView上的layoutSubviews事件
    • 6.改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
  • 1.3 注:setNeedsLayout方法并不会立即刷新,立即刷新需要调用layoutIfNeeded方法。

2、setNeedsDisplay方法

  • 与setNeedsLayOut方法相似的方法是setNeedsDisplay方法。该方法在调用时,会自动调用drawRect方法。drawRect方法主要用来画图。
  • 2.1 总结

    • 所以,当需要刷新布局时,用setNeedsLayOut方法;当需要重新绘画时,调用setNeedsDisplay方法。
  • 2.2 延伸:

    • 当我们自定义UI控件时,需要重写一些方法:
    • UIView控件只是一个矩形的空白区域并没有任何内容。iOS应用的其他UI控件都继承了UIView这些UI控件都是在UIView提供的空白区域上绘制外观。
    • 基于UI控件的实现原理开发者完全可以开发出项目定制的控件——当iOS系统提供的UI控件不足以满足项目需要时开发者可以通过继承UIView来派生自定义控件。
    • 当开发者打算派生自己的UI控件时首先定义一个继承View基类的子类然后重写View类的一个或多个方法通常可以被用户重写的方法如下。
     initWithFrame:             前面已经见到程序创建UI控件时常常会调用该方法执行初始化因此如果你需要对UI控件执行一些额外的初始化即可通过重写该方法来实现。
    initWithCoder: 程序通过在nib文件中加载完该控件后会自动调用该方法。因此如果程序需要在nib文件中加载该控件后执行自定义初始化则可通过重写该方法来实现。
    drawRect: 如果程序需要自行绘制该控件的内容则可通过重写该方法来实现。
    layoutSubviews 如果程序需要对该控件所包含的子控件布局进行更精确的控制可通过重写该方法来实现。
    didAddSubview: 当该控件添加子控件完成时将会激发该方法。
    willRemoveSubview: 当该控件将要删除子控件时将会激发该方法。
    willMoveToSuperview: 当该控件将要添加到其父控件中时将会激发该方法。
    didMoveToSuperview 当把该控件添加到父控件完成时将会激发该方法。
    willMoveToWindow: 当该控件将要添加到窗口中时将会激发该方法。
    didMoveToWindow 当把该控件添加到窗口完成时将会激发该方法。
    touchesBegan:withEvent: 当用户手指开始触碰该控件时将会激发该方法。
    touchesMoved:withEvent: 当用户手指在该控件上移动时将会激发该方法。
    touchesEnded:withEvent: 当用户手指结束触碰该控件时将会激发该方法。
    touchesCancelled:withEvent:用户取消触碰该控件时将会激发该方法。
    • 当需要开发自定义View时开发者并不需要重写上面列出的所有方法而是根据业务需要重写上面的部分方法。例如下面的跟随手指运动的小球示例程序就只重写drawRect:方法。
     #import "FKCustomView.h"
    @implementation FKCustomView
    // 定义两个变量记录当前触碰点的坐标
    int curX;
    int curY;
    - ( void ) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    // 获取触碰事件的UITouch事件
    UITouch *touch = [touches anyObject];
    // 得到触碰事件在当前组件上的触碰点
    CGPoint lastTouch = [touch locationInView:self];
    // 获取触碰点的坐标
    curX = lastTouch.x;
    curY = lastTouch.y;
    // 通知该组件重绘
    [self setNeedsDisplay];
    } // 重写该方法来绘制该UI控件
    - ( void )drawRect:(CGRect)rect {
    // 获取绘图上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    // 设置填充颜色
    CGContextSetFillColorWithColor(ctx, [[UIColor redColor] CGColor]);
    // 以触碰点为圆心绘制一个圆形
    CGContextFillEllipseInRect(ctx, CGRectMake(curX - 10, curY - 10, 20, 20));
    }
    @end

iOS开发:setNeedsLayOut和setNeedsDisplay区别的更多相关文章

  1. iOS开发-NSOperation与GCD区别

    Mac OS X 10.6及iOS4.0之后导入了可以使全体线程更高效运行,并且使并行处理应用更易开发的架构,GCD(Grand Central  Dispatch),同时引入的还有Run Loop, ...

  2. iOS 开发 atomic 与 nonatomic 区别

    atomic :  变量默认是有该有属性的,这个属性是为了保证在多线程的情况下,编译器会自动生成一些互斥加锁的代码,避免该变量的读写不同步的问题. nonatomic  : 如果该对象无需考虑多线程的 ...

  3. iOS开发NS_ENUM和NS_OPTIONS区别

    OC里枚举的两种类型.NS_ENUM和NS_OPTIONS本质上是一样的都是枚举. typedef NS_ENUM(NSInteger, UIViewAnimationTransition) { UI ...

  4. iOS开发makeKeyAndVisible和makeKeyWindow区别

    参考链接:https://www.jianshu.com/p/c7647caa8bd1

  5. iOS开发系统类功能划分

    0.OC语法基础 CHOCBase Object C语法学习笔记(一) Object C语法学习笔记(二) 1.UI类 自定义控件程序运行流程 setNeedsLayOut和setNeedsDispl ...

  6. # ios开发 @property 和 Ivar 的区别

    ios开发 @property 和 Ivar 的区别 @property 属性其实是对成员变量的一种封装.我们先大概这样理解: @property = Ivar + setter + getter I ...

  7. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  8. [BS-17] iOS开发-Alpha,Hidden和Opaque区别

    iOS开发-Alpha,Hidden和Opaque区别   UIView控件都有Alpha,Hidden和Opaque这三个常见属性,UIView控件BackgroundColor是用RGBA表示的, ...

  9. iOS开发——OC篇&常用关键字的使用与区别

    copy,assign,strong,retain,weak,readonly,readwrite,nonatomic,atomic,unsafe_unretained的使用与区别 最近在学习iOS的 ...

随机推荐

  1. Linux开放80、8080端口或者开放某个端口

    装载系统的时候只开启了22端口.结果再装完Nginx+php+mysql 后不能访问网站. 查看防火墙设置发现没开启80端口 iptables -L -n 由于Linux防火墙默认是关闭的.可以用两种 ...

  2. 接口方式[推荐]/动态SQL语句

    MVC目录结构: Src -- com.shxt.servlet[控制层] --com.shxt.service[业务逻辑层] --com.shxt.model[实体Bean,用来承载数据] --co ...

  3. Docker持续化集成和测试

     基于容器的自动构建:Docker在美团的应用 https://linux.cn/article-5465-1.html Docker持续化集成和测试,关于docker-in-docker问题 h ...

  4. redis使用测试

    import redis conn=redis.Redis(host='127.0.0.1',port=6379) conn.set('nn','morgana',10) #过期时间10s v=con ...

  5. DAY3-python函数

    目录 一.了解函数 二. 函数定义 三.函数使用原则:先定义,后调用 四.定义函数的三种形式 五.函数的调用 六.函数的参数 七. 函数对象 八.函数嵌套 九.名称空间与作用域 十. 闭包函数 十一. ...

  6. LookupError: unknown encoding: cp65001解决办法

    一.之前手上做的一个web项目,漏洞频发,服务器用的是菜鸟云服务器,那个应急响应中心不错,想不到乌云倒了,白帽子竟然被阿里系养了,题外话了,首先感谢白帽子提的漏洞,同时也感慨自己安全知识,以及意识的薄 ...

  7. python爬虫(3)--异常处理

    1.URLError 首先解释下URLError可能产生的原因: 网络无连接,即本机无法上网 连接不到特定的服务器 服务器不存在 在代码中,我们需要用try-except语句来包围并捕获相应的异常. ...

  8. 如何选择RDBMS关系型数据库和Nosql非关系型数据库?

    RDBMS关系型数据库和Nosql非关系型数据库区别: 一.RDBMS是关系型数据库模式: 1.二维模式,由行列组成. 2.非常强调事务原子性,例如用户提出一个请求,DB完整的去执行,如果报错就全部回 ...

  9. HDU 5242 树链剖分思想的贪心

    题意及博客 树链剖分分为2步,第一次求出深度,重儿子,第二次求出重链,用到了启发式的思想,即对于比较重的儿子,尽量去完整的维护它.类似于我们去合并两个堆,明显把小的堆逐个插入大的堆中会比大的往小的插更 ...

  10. Swing简介

    ---------------siwuxie095                         Swing 简介:     Java Swing 是 Java Foundation Classes ...