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. 存储过程错误异常处理例子 --> DECLARE EXIT HANDLER FOR SQLEXCEPTION (转)

    刚才一个朋友问到:  mysql  有类似 mssql 退出执行的方法不? 比如我执行到某个条件,下面就终止执行了.  想起以前写的存储过程,找了好久才找到,就发给他,希望对他有所帮助,贴在这里,留作 ...

  2. ORA-28547:connection to server failed, probable Oracle Net admin error错误,解决方法

    当用navicat连接oralce数据库时报ORA-28547错误时,直接懵逼了,上网查了资料说是navicat自带的oci.dll文件的版本和服务器端的oralce数据库的版本不一致造成的. 修改O ...

  3. POJ3321(dfs序列+树状数组)

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25711   Accepted: 7624 Descr ...

  4. 机器学习:集成学习(集成学习思想、scikit-learn 中的集成分类器)

    一.集成学习的思想 集成学习的思路:一个问题(如分类问题),让多种算法参与预测(如下图中的算法都可以解决分类问题),在多个预测结果中,选择出现最多的预测类别做为该样本的最终预测类别: 生活中的集成思维 ...

  5. 2018年长沙理工大学第十三届程序设计竞赛 Dzzq的离散数学教室1

    Dzzq的离散数学教室1 链接:https://www.nowcoder.com/acm/contest/96/D来源:牛客网 zzq的离散数学教室1 时间限制:C/C++ 1秒,其他语言2秒 空间限 ...

  6. Java-API:un-java.util.Set

    ylbtech-Java-API:java.util.Set 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 0. https://docs.oracle.com ...

  7. 11-16网页基础--HTML

    网页制作部分主要讲解三大部分: 1.HTML    超文本标记语言( 全称:Hyper Text  Markup Language) 专门编辑静态网页 2.CSS      网页美化:是HTML控制的 ...

  8. 关于使用字库-雅黑字体(msyh.ttf )显示中文的一些。。。

    开发中有关程序在使用字库 雅黑字体的 的时候 vs下一开始没有显示出中文来,都是乱码. 在android下使用该字体库的时候同样也没有显示出中文,后来搜搜了原因,得知编码必须是UTF-8 也就是使用字 ...

  9. Linux split命令实例

    曾经是否想要把一个大文件分割成多个小文件?比如一个5gb日志文件,我们需要把它分成多个小文件,这样我们才有可能使用普通的文本编辑器读取它.有时我们需要传输20gb的大文件到另一台服务器,这就需要我们把 ...

  10. oracle -sqlplus 调用存储过程

    sp.batsqlplus user/passwd/sid  @.\sp.sql >sp.sqlexit; sp.sqlexex xxxx()quit;