drawrect 自动调用什么时候调用

iOS开发之drawRect的作用和调用机制 - CSDN博客
iOS开发之drawRect的作用和调用机制
一、重绘机制
iOS的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一个扩展UIView 的类,并重写drawRect方法,在这里进行绘图操作,程序会自动调用此方法进行绘图。
重绘操作仍然在drawRect方法中完成,但是苹果不建议直接调用drawRect方法,当然如果你强直直接调用此方法,当然是没有效果的。苹果要求我们调用UIView类中的setNeedsDisplay方法,则程序会自动调用drawRect方法进行重绘。(调用setNeedsDisplay会自动调用drawRect)。
在UIView中,重写drawRect: (CGRect) aRect方法,可以自己定义想要画的图案.且此方法一般情况下只会画一次.也就是说这个drawRect方法一般情况下只会被掉用一次. 当某些情况下想要手动重画这个View,只需要掉用[self setNeedsDisplay]方法即可.
二、方法定义
①、- (void)drawRect:(CGRect)
重写此方法,执行重绘任务
②、- (void)setNeedsD
标记为需要重绘,异步调用drawRect
③、- (void)setNeedsDisplayInRect:(CGRect)
标记为需要局部重绘
三、drawRect调用机制
drawRect调用是在Controller-&loadView,,Controller-&viewDidLoad 两方法之后调用的。所以不用担心在控制器中,这些View的drawRect就开始画了。这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量值).
1、若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或者 setNeedsDisplayInRect ,让系统自动调该方法。
2、若使用calayer绘图,只能在drawInContext: 中(类似于drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法。
3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕
1、若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或者 setNeedsDisplayInRect ,让系统自动调该方法。
2、若使用calayer绘图,只能在drawInContext: 中(类似于drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法。
3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕
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秒后重绘。
本文已收录于以下专栏:
相关文章推荐
一、重绘机制iOS的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一个扩展UIView 的类,并重写drawRect方法,在这里进行绘图操作...
原文  /blog//ioskai-fa-zhi-layoutsubviewsde-zuo-yong-he-diao-yong-ji-z...
苹果官方文档已经强调,不能直接调用layoutSubviews对子视图进行重新布局。那么,layoutSubviews什么情况下会被调用呢?通过百度搜索,发现以下几种情况layoutSubviews会...
iOS开发之layoutSubviews的作用和调用机制
在UIView里面有一个方法layoutSubviews,这个方法具体作用是什么呢?
- (void)layoutS
// override point. called by l...
转载自:http://www./lib/view/open2.html
原文  ...
一、定义在UIView里面有一个方法layoutSubviews,这个方法定义如下
- (void)layoutS
// override point. called by l...
iOS的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一个扩展UIView 的类,并重写drawRect方法,在这里进行绘图操作,程序会自动...
iOS的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一个扩展UIView
的类,并重写drawRect方法,在这里进行绘图操作,程序会...
iOS的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一个扩展UIView 的类,并重写drawRect方法,在这里进行绘图操作,程序会自动...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)drawRect方法的注意问题 - 简书
drawRect方法的注意问题
drawRect:方法解析
1.drawRect:方法专门用来绘图的,当view显示的时候会调用,由系统自动调用的;
2.注意方法调用顺序在viewDidLoad -& viewWillAppear -& drawRect -viewDidA
1.在这个方法中-(void)drawRect:(CGRect)rect;这个rect就是我们自定义UIView的view的尺寸;如果UIView初始化没有设置rect大小,将直接导致drawRect不被自动调用;
2.刚才也提到了,drawRect方法的调用顺序,是在view要显示的时候才调用,这样我们可以在控制器中给view设置某些值,以便于view绘制的时候使用;
3.这个方法是系统自动调用的,如果我们需要重新绘制,可以调用setNeedsDisplay方法;
4.该方法在调用sizeToFit后也会被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法
5.若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕> 博客详情
注意三点:
1、两个方法都是异步执行的
2、使用init初始化UIView两个方法都不会调用,所以在init中最好是初始化数据,而在上述两个方法中初始化视图
3、最好使用drawRect初始化视图,layoutSubviews在继承UIScrollView或UITableView等情况下,会调用两次
@interface&MyView&:&UIView
#import&"MyView.h"
@implementation&MyView
-&(instancetype)init
&&&&NSLog(@"%@",&NSStringFromSelector(_cmd));
&&&&return&[super&init];
-&(instancetype)initWithFrame:(CGRect)frame
&&&&NSLog(@"%@",&NSStringFromSelector(_cmd));
&&&&return&[super&initWithFrame:frame];
-&(void)drawRect:(CGRect)rect&{
&&&&NSLog(@"%@",&NSStringFromSelector(_cmd));
-&(void)layoutSubviews&{
&&&NSLog(@"%@",&NSStringFromSelector(_cmd));
打印结果是:
&19:45:00.919&ViewDemo[]&initWithFrame:
&19:45:00.924&ViewDemo[]&layoutSubviews
&19:45:00.924&ViewDemo[]&drawRect:
如果把 MyView.h换成
@interface&MyView&:&UIScrollView
打印结果是:
&19:50:50.499&ViewDemo[]&initWithFrame:
&19:50:50.513&ViewDemo[]&layoutSubviews
&19:50:50.513&ViewDemo[]&layoutSubviews
&19:50:50.513&ViewDemo[]&drawRect:
可以看出layoutSubviews会打印两次,再MyView继承UILabel、UIButton、UITableView和UICollectionView等等情况下,都会调用两次。
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥使用drawRect有什么影响? - 简书
使用drawRect有什么影响?
用来画图,这个方法会在intiWithRect时候调用。这个方法的影响在于有touch event的时候之后,会重新绘制,很多这样的按钮的话就会比较影响效率。以下都会被调用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。2015年5月 移动开发大版内专家分月排行榜第一2015年4月 移动开发大版内专家分月排行榜第一2014年9月 移动开发大版内专家分月排行榜第一
2015年3月 移动开发大版内专家分月排行榜第二2014年8月 移动开发大版内专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 drawrect什么时候调用 的文章

 

随机推荐