zoukankan      html  css  js  c++  java
  • 【iOS入门】View的生命周期与frame变化

    View的生命周期与frame变化

    不同初始化方式调用的生命周期方法

    1、使用init方法初始化View

    UIView *view = [UIView alloc] init];
    [self.view addSubView:view];
    

    依次输出

    initWithFrame:  
    init  
    setNeedsLayout  
    layoutSubviews
    

    无论任何时候使用init方法创建,此四个方法都会依次调用,但因为view没有size所以不会执行drawRect方法,在创建语句中设置Size后即会调用drawRect
    注意:若在viewDidLoad中创建了view没有赋值size,在viewDidAppear再赋值size不会执行drawRect方法,导致view无法渲染

    2、使用initWithFrame:初始化view

    initWithFrame:
    setNeedsLayout
    layoutSubviews
    drawRect:
    

    使用initWithFrame方法不存在以上问题

    使用xib或Storyboard方式添加

    • 在Storyboard或Xib中添加view
    initWithCoder:
    awakeFromNib
    layoutSubviews
    drawRect:
    

    使用视图创建的view初始化时不会执行setNeedsLayout方法,但一旦修改了view的frame便会执行setNeedsLayout和layoutSubviews方法
    在执行drawRect方法之前修改view的frame属性,其frame属性只有在执行setNeedsLayout时才被更改,因此若在initWithCoder或awakeFromNib方法中做子view的代码布局,则必须确保父view的frame不会更改,否则将达不到预期效果

    • 使用xib代码初始化View
    [[NSBundle mainBundle] loadNibNamed:<(nonnull NSString *)> owner:<(nullable id)> options:<(nullable NSDictionary *)>];
    
    initWithCoder:
    awakeFromNib
    setNeedsLayout
    layoutSubviews
    drawRect:
    

    其中initWithCoder:awakeFromNib在初始化时执行,剩余方法在addSubview:时执行
    修改view的frame情况同上,建议子view的初始化方法在layoutSubviews或drawRect中执行



    作者:Warl_G
    链接:https://www.jianshu.com/p/462fdabcd5f7
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    基于selenium的web自动化框架
    spring boot整合Mybatis
    Spring boot进阶-配置Controller、interceptor...
    spring boot 第一个Demo
    Spring事务管理
    mybatis、Spring整合(eclipse)以及事务管理
    highcharts 根据表格转化为不同的图表
    highChartTable 切换
    highcharts 切换
    九度 1533 最长上升子序列
  • 原文地址:https://www.cnblogs.com/mamamia/p/12175709.html
Copyright © 2011-2022 走看看