• 【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
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    jumpserver安装教程
    正则表达式基础->
    Awk基础
    shell脚本练习题->1
    idea开发工具下载安装教程
    shell 数组基础->
    动荡的国庆前后
    Linux命令之查找
    2013年9月游戏测试总结-文档习惯
    将C#程序做成服务后服务自动停止的问题
  • 原文地址:https://www.cnblogs.com/mamamia/p/12175709.html
Copyright © 2020-2023  润新知