UIView的setNeedsDisplay和setNeedsLayout方法

1,UIView的setNeedsDisplay和setNeedsLayout方法

  首先两个方法都是异步执行的。而setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到  UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,

 就可以  处理子视图中的一些数据。

综上所诉,setNeedsDisplay方便绘图,而layoutSubViews方便出来数据。

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

1、init初始化不会触发layoutSubviews。

2、addSubview会触发layoutSubviews。

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

4、滚动一个UIScrollView会触发layoutSubviews。

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

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

7、直接调用setLayoutSubviews。

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

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

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

3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改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实时刷新屏幕

时间: 2024-12-05 02:32:03

UIView的setNeedsDisplay和setNeedsLayout方法的相关文章

UIView的layoutSubviews和drawRect方法何时调用

之前做登录时遇到键盘弹出要改约束的问题,今天又遇到类似的问题,改约束就要重新绘图,让我又想起了layoutSubviews.drawRect方法调用的问题,自己想了想还是想的不全,还是要百度.搜到了http://blog.csdn.net/zzfsuiye/article/details/8807875这篇博客,写的挺好,算是转载一下,方便以后再次使用. 首先两个方法都是异步执行.layoutSubviews方便数据计算,drawRect方便视图重绘 layoutSubviews在以下情况下会被

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

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

UIView如何管理它的子视图

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

开发IOS关于子UIViewController和父UIViewController相互调用方法

  今天在做iphone开发时碰到了一个常用的需求,即在一个viewController中添加另外一个viewController,同时能保证这两个ViewController之间能够相互交互且相互调用方法和函数,在网上查了很多资料,很多开发者说需要使用objective-c变态的 delegate,可是我感觉delegate是使用在两个同级之间的UIView比较好,至于能不能使用在父子关系而且是 UIVeiwController我也不太清楚,也没有亲自实验过,通过查看SDK的API及其他资料我

详解iOS应用中自定义UIBarButtonItem导航按钮的创建方法_IOS

iOS系统导航栏中有leftBarButtonItem和rightBarButtonItem,我们可以根据自己的需求来自定义这两个UIBarButtonItem. 四种创建方法 系统提供了四种创建的方法: 复制代码 代码如下: - (instancetype)initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem target:(id)target action:(SEL)action; - (instancetype)init

iOS中 动态热修补技术JSPatch 韩俊强的博客

iOS开发者交流群:446310206   所谓动态热修补就是把能够导致app 崩溃的严重bug,提交新版本到appstore 审核速度太慢影响用户使用,这时候就可以利用 JSPatch 可以让你用 JavaScript 书写原生 iOS APP.只需在项目引入极小的引擎,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,获得脚本语言的优势:为项目动态添加模块,或替换项目原生代码动态修复 bug. 这里就不在赘述优缺点重点看实现! 每日更新关注:http://wei

ios上 更改 状态栏(UIStatusBar)的颜色

IOS上 关于状态栏的相关设置(UIStatusBar) 知识普及 ios上状态栏 就是指的最上面的20像素高的部分  状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时间等部分: 背景部分:就是显示黑色或者图片的背景部分: 如下图:前景部分为白色,背景部分为黑色  注意:这里只涉及到ios7以及更高版本,低版本下面的讲解可能无效. 设置statusBar的[前景部分] 简单来说,就是设置显示电池电量.时间.网络部分标示的颜色,  这里只能设置两种颜色: 默认的黑

WWDC 2012 Session笔记——219 Advanced Collection Views and Building Custom Layouts

这是博主的WWDC2012笔记系列中的一篇,完整的笔记列表可以参看这里.如果您是首次来到本站,也许您会有兴趣通过RSS,或者通过页面左侧的邮件订阅的方式订阅本站. 在上一篇UICollectionView的入门介绍中,大概地对iOS6新加入的强大的UICollectionView进行了一些说明.在这篇博文中,将结合WWDC2012 Session219:Advanced Collection View的内容,对Collection View进行一个深入的使用探讨,并给出一个自定义的Demo. U

拥抱Core Graphics吧!

Core Graphics用于处理本地2D向量渲染和图片渲染.其中满是名称相近,让人郁闷的C接口. 对于在iOS上编程有一段时间的人来说有别的方法也会尽量避免使用这些C函数. 毕竟直接用xCode已有控件的话,只要拖一拖,然后少许的代码就可以做出某些效果,何必 自找苦吃?!但是Core Graphics有一个很大的优点:快! ps,我不是说要重复找轮子.   绘制在drawRect:方法中进行 当一个View需要绘制的时候,drawRect:方法会被调用.在这个方法中Core Graphics就