注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

iOS 开发小结之layoutSubviews调用  

来自姜cong   2015-11-11 15:08:25|  分类: 移动APP |举报 |字号 订阅

  下载LOFTER 我的照片书  |
iOS中的layoutSubviews是UIView的方法,该方法用于更精确的视图进行布局,可以在子类里重写这个方法。
开发过程中,了解layoutSubviews何时会被调用,从而可以熟悉uiview的重绘机制
参考网络资料,并进行验证,在此记录,希望大家一起探讨学习

测试定义UIView类TestView

#import "TestView.h"


@implementation TestView


-(id)initWithFrame:(CGRect)frame{

    self=[super initWithFrame:frame];

    if (self) {

        NSLog(@"initWithFrame:%@",NSStringFromCGRect(frame));

    }

    return self;

}

//重写layoutSubviews方法

-(void)layoutSubviews{

    NSLog(@"layoutSunView %@"self);

    [super layoutSubviews];

}


@end



测试代码
在视图控制器ViewControllerviewDidLoad方法调用testX

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    [self testX];

}

1、init初始化不会触发layoutSubviews
结果:没有调用layoutSubviews

2、addSubview会触发layoutSubviews(frame!={0,0,0,0})
frame={0,0,0,0}
测试代码test21

-(void)test21{

    TestView *test = [[TestView allocinit];

    [self.view addSubview:test];

}

结果:调用了addSubview,但frame={0,0,0,0},没有绘制,所以不会调用TestView类的layoutSubviews方法


frame!={0,0,0,0}
测试代码test22

-(void)test22{

    TestView *test = [[TestView allocinit];

    test.frame = CGRectMake(00100100);

    [self.view addSubview:test];

}

结果:frame!={0,0,0,0},会调用TestView类的layoutSubviews方法



3、设置view的Frame会触发layoutSubviews,前提是frame的值设置前后发生了变化(view的with,height发现变化才会触发layoutSubviews,original. x ,original. y变化不会触发layoutSubviews
公共代码test3

-(void)test3{

    _largeView = [[TestView allocinit];

    _largeView.frame = CGRectMake(005050);

    [_largeView setBackgroundColor:[UIColor greenColor]];

    [self.view addSubview:_largeView];

    _timer = [NSTimer scheduledTimerWithTimeInterval:1.f

                                              target:self

                                            selector:@selector(timerEventX:)

                                            userInfo:nil

                                            repeats:YES];

}

case1:frame{0,0,50,50}变化为frame{random,random,random,random}
timerEvent1:

- (void)timerEvent1:(id)sender

{

   _smallView.frame = CGRectMake(arc4random()%100 + 20,

                                  arc4random()%100 + 20,

                                  arc4random()%100 + 20,

                                  arc4random()%100 + 20);

}

结果:frame发生变化,且包括oringal,width,height,方法layoutSubviews被调用


case2:{0,0,50,50}变化为frame{0,0,random,random}
timerEvent2:

- (void)timerEvent2:(id)sender

{

   _smallView.frame = CGRectMake(0,

                                  0,

                                  arc4random()%100 + 20,

                                  arc4random()%100 + 20);

}

结果:frame的oringal不变,width,height变化,方法layoutSubviews被调用


case3:{0,0,50,50}变化为frame{random ,random ,0,0}
timerEvent3:

- (void)timerEvent3:(id)sender

{

   _smallView.frame = CGRectMake(arc4random()%100 + 20,

                                  arc4random()%100 + 20

                                  50,

                                  50);

}

结果:frame的oringal变化,width,height不变,方法layoutSubviews不被调用




对于测试如何了解layoutSubviews调用时机,可以较好掌握uiview显示的机理,有利于测试过程

好这里总结下

1、init初始化不会触发layoutSubviews

2、addSubview会触发layoutSubviews(但frame!={0,0,0,0})

3、设置view的Frame会触发layoutSubviews,前提是frame的值设置前后发生了变化(view的with,height发现变化才会触发layoutSubviews,original. x ,original. y变化不会触发layoutSubviews



  评论这张
 
阅读(803)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016