UIView的drawRect和layoutSubviews方法

注意三点:

1、两个方法都是异步执行的

2、使用init初始化UIView两个方法都不会调用,所以在init中最好是初始化数据,而在上述两个方法中初始化视图

3、最好使用drawRect初始化视图,layoutSubviews在继承UIScrollView或UITableView等情况下,会调用两次


MyView.h

@interface MyView : UIView
@end

MyView.m

#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));
}
@end

打印结果是:

2015-06-09 19:45:00.919 ViewDemo[5621:283667] initWithFrame:
2015-06-09 19:45:00.924 ViewDemo[5621:283667] layoutSubviews
2015-06-09 19:45:00.924 ViewDemo[5621:283667] drawRect:

如果把 MyView.h换成

@interface MyView : UIScrollView
@end

打印结果是:

2015-06-09 19:50:50.499 ViewDemo[5642:289117] initWithFrame:
2015-06-09 19:50:50.513 ViewDemo[5642:289117] layoutSubviews
2015-06-09 19:50:50.513 ViewDemo[5642:289117] layoutSubviews
2015-06-09 19:50:50.513 ViewDemo[5642:289117] drawRect:

可以看出layoutSubviews会打印两次,再MyView继承UILabel、UIButton、UITableView和UICollectionView等等情况下,都会调用两次。

时间: 2024-11-04 13:05:29

UIView的drawRect和layoutSubviews方法的相关文章

25、UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释

layoutSubviews总结 ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size- (void)sizeToFit------- - (void)layoutSubviews- (void)layoutIfNeeded- (void)setNeedsLayout------– - (void)setNeedsDisplay- (void)drawRectlayoutSubviews在以下情况下会被调用: 1.init初始化不会触发layo

UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释(转)

layoutSubviews总结 ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size- (void)sizeToFit—————— - (void)layoutSubviews- (void)layoutIfNeeded- (void)setNeedsLayout—————— - (void)setNeedsDisplay- (void)drawRect layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layou

UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释

layoutSubviews总结 ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size- (void)sizeToFit------- - (void)layoutSubviews- (void)layoutIfNeeded- (void)setNeedsLayout------– - (void)setNeedsDisplay- (void)drawRectlayoutSubviews在以下情况下会被调用: 1.init初始化不会触发layo

UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释(转)

layoutSubviews总结 ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size- (void)sizeToFit------- - (void)layoutSubviews- (void)layoutIfNeeded- (void)setNeedsLayout------– - (void)setNeedsDisplay- (void)drawRectlayoutSubviews在以下情况下会被调用: 1.init初始化不会触发layo

UIView的setNeedsDisplay和setNeedsLayout方法

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

UIView的几个layout方法

iOS layout的相关方法: 1,layoutSubviews 2,layoutIfNeeded 3,setNeedsLayout 4,setNeedsDisplay 5,drawRect 6,sizeThatFits 7,sizeToFit 大概有以上几个. 一,layoutSubviews 这个方法,默认没有做任何事情,需要子类进行重写.layoutSubviews会在以下情况下被调用: 1,init初始化不会触发layoutSubviews,如果设置了不为CGRectZero的fram

drawRect和layoutSubviews的区别

两个方法都是异步执行的,layoutSubviews方便数据计算,drawRect方便视图重绘. layoutSubviews对subviews重新布局layoutSubviews方法调用先于drawRect

drawRect setNeedsDisplay layoutSubViews

drawRect   setNeedsDisplay layoutSubViews 1. drawRect: is invoked automaticall,never call it directly!! 2. When a view needs to be redrawn,use: - (void)setNeedsDisplay; 3.在非主线程中调用,需使用如下方法: - (void)performSelector:(SEL)aSelector onThread:(NSThread *)t

[iOS]调用layoutSubViews方法(有的时候为啥会调用2遍)

layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSubviews 但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会触发 2.addSubview会触发layoutSubviews 3.设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化 4.滚动一个UIScrollView会触发layoutSubviews 5.旋转Screen会触发父UIView上的lay