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. 日志收集系统搭建-BELK

    前言 日志是我们分析系统运行情况.问题定位.优化分析等主要数据源头.目前,主流的业务系统都采用了分布式.微服务的形式.如果想要查看日志,就需要从不同的节点上去查看,而且对于整个业务链路也非常不清晰.因 ...

  2. webrtc自带client的视频引擎创建代码走读

    src\webrtc\examples\peerconnection\client\conductor.ccbool Conductor::InitializePeerConnection()1 we ...

  3. bae3.0第一步 添加框架支持

    1.克隆bae上应用代码: 先在本地linux机器上创建文件夹bae并进入, 再执行git clone https://git.duapp.com/appidd01iud80bg 结果会在bae文件夹 ...

  4. 编译PHP扩展的通用方法

    以安装swoole扩展为例: 步骤1: wget  pecl.php.net/get/swoole-1.7.21.tgz  (下载swoole打包文件) 步骤2: tar zxvf swoole-1. ...

  5. MySQL的varchar类型注意事项

    前几天就在工作中发现这样一个问题:当某个字段的类型为varchar时,字段保存的值类似'100,200,300'  和 '100' 或 '100,400'.写SQL语句的时候就会犯这样的错误,例如: ...

  6. HTML 和 CSS

    HTML html是英文hyper text mark-up language(超文本标记语言)的缩写,它是一种制作万维网页面标准语言.   内容摘要   Doctype 告诉浏览器使用什么样的htm ...

  7. java代码流类。。程序怎么跟书上的结果不一样???

    总结:这个程序很容易懂.的那是这个结果我觉得有问题啊..怎么“stop”后,输出的内容是输入过的呢? 应该是没有关系的呀,与输入的值是不同的....怎么书上运行的结果和我的不一样啊 package c ...

  8. git教程(远程仓库和管理分支)

    在github上新建了一个仓库,然后相与本地的仓库联系起来 $ Git remote add origin https://github.com/liona329/learngit.git fatal ...

  9. linux设置支持中文

    LANG="zh_CN.UTF-8" #LANG="zh_CN.GB18030" #LANG=en_US.UTF-8 LANGUAGE="zh_CN. ...

  10. Spring MVC F5刷新问题

    转自:https://bbs.csdn.net/topics/390771056 post操作成功后重定向到B,这样浏览器里F5的时候就不会让提交A了