iOS生命周期UIViewController,UIView

2024-05-03 11:18

本文主要是介绍iOS生命周期UIViewController,UIView,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

UIViewController

  1. 创建实例有分为StoryBoard和非StoryBoard的
    1.1非StoryBoard:- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    1.2StoryBoard:- (instancetype)initWithCoder:(NSCoder *)aDecoder

  2. awakeFromNib:当有storeboard或者xib关联VC的时候,先将这个方法加载,达到补充初始化的效果(如添加一些用户设置喜好)

  3. loadView:它是在view被访问且为空的时候调用,来给VC加载或者创建一个View作为VC的属性。请不要手动调用它。创建View的过程是优先去找对应的xib文件,找不到则创建一个空的。

  4. viewDidLoad:View已经加载到内存中,这里进行初始化设置

  5. viewWillAppear:系统在载入所有的数据后调用,这里可以设置设备不同方向时该如何显示;设置状态栏方向、设置视图显示样式等。

  6. viewWillLayoutSubviews:view即将布局其Subviews。 比如view的bounds改变了(例如:状态栏从不显示到显示,视图方向变化),要调整Subviews的位置,在调整之前要做的工作可以放在该方法中实现。

The default implementation of this method does nothing.

  1. viewDidLayoutSubviews:布局完成后调用,用于复写。
  2. viewDidAppear:视图出现了
  3. viewWillDisappear:此时还没有调用removeFromSuperview
  4. viewDidDisappear:已经调用removeFromSuperview
  5. dealloc,init和viewDidLoad中创建的对象进行释放
  6. didReceiveMemoryWarning:内存警告,这里可以释放一些对象的所有权,也就是将指针致为nil
    image

UIView

看一个VC加载UIView的全部过程

[CoreTextVC initWithCoder:]
[CoreTextVC awakeFromNib]
[CoreTextVC loadView]
[CoreTextVC viewDidLoad]
[CoreTextView initWithFrame:]
[CoreTextView willMoveToSuperview:]
[CoreTextView didMoveToSuperview]
[CoreTextVC viewWillAppear:]
[CoreTextView willMoveToWindow:]
[CoreTextView didMoveToWindow]
[CoreTextVC viewWillLayoutSubviews]
[CoreTextVC viewDidLayoutSubviews]
[CoreTextView layoutSubviews]
[CoreTextView drawRect:]
[CoreTextVC viewDidAppear:]
[CoreTextView drawRect:]
//关闭
[CoreTextView willMoveToWindow:]
[CoreTextView didMoveToWindow]
[CoreTextVC viewDidDisappear:]
[CoreTextVC dealloc]
[CoreTextView didMoveToSuperview]
[CoreTextView dealloc]

关于layoutSubviews的官方文档

You can use your implementation to set the frame rectangles of your subviews directly.
You should not call this method directly. If you want to force a layout update, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded method.
就是说可以直接设置frame,并且由setNeedsLayout可以调起

layoutIfNeeded和setNeedsLayout的区别
setNeedsLayout:标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,在下一轮runloop结束前刷新,对于这一轮runloop之内的所有布局和UI上的更新只会刷新一次,layoutSubviews一定会被调用
layoutIfNeeded:如果有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)

假定三种情况

  1. 直接调用layoutIfNeeded或者直接调用setNeedsLayout,这时候并没有position上面的调整,所以并不会调用layoutSubviews方法。
  2. 先调用setNeedsLayout,再调用layoutIfNeeded,这时候即使没有position的变化也会调用layoutSubviews
  3. 只改变View.frame,会调用layoutSubviews
  4. 改变View.frame,同时调用layoutIfNeeded,会调用layoutSubviews
  5. 区别
    第4种情况下,先调用了layoutSubviews
    2019-06-10 16:45:24.375970+0800 iOS_Study[9386:137331] -[CoreTextView layoutSubviews]
    2019-06-10 16:45:24.376296+0800 iOS_Study[9386:137331] -[CoreTextVC viewWillLayoutSubviews]
    2019-06-10 16:45:24.376413+0800 iOS_Study[9386:137331] -[CoreTextVC viewDidLayoutSubviews]
    第3种情况下,VC先调用
    2019-06-10 16:43:25.484940+0800 iOS_Study[9351:136038] -[CoreTextVC viewWillLayoutSubviews]
    2019-06-10 16:43:25.485106+0800 iOS_Study[9351:136038] -[CoreTextVC viewDidLayoutSubviews]
    2019-06-10 16:43:25.485204+0800 iOS_Study[9351:136038] -[CoreTextView layoutSubviews]

也就是说正常情况下是先VC,layoutsubviews然后才是View内部的layoutSubviews,但是如果是加了layoutIfneed,则是直接先调用了View的

这篇关于iOS生命周期UIViewController,UIView的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/956616

相关文章

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

Maven(插件配置和生命周期的绑定)

1.这篇文章很好,介绍的maven插件的。 2.maven的source插件为例,可以把源代码打成包。 Goals Overview就可以查看该插件下面所有的目标。 这里我们要使用的是source:jar-no-fork。 3.查看source插件的example,然后配置到riil-collect.xml中。  <build>   <plugins>    <pl

【Vue】关于Vue3的生命周期

目录 Vue3中新增了一个setup生命周期函数:(1) setup执行的时机是在beforeCreate生命周期函数之前执行,在setup函数中是不能通过this来获取实例的;(2) 为了命名的统一性,将beforeDestroy 改名为 beforeUnmount,destroyed 改名为 unmounted 生命周期函数: setup —— 不能通过this来获

09 生命周期

生命周期 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestorydestoryed 辣子鸡:香辣入口,犹如吃了炫迈一样 - - - 根本停不下来 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport"

Maven生命周期:深入理解构建过程

目录 1. Maven生命周期简介 2. 默认生命周期的阶段 3. 清理生命周期 4. 站点生命周期 5. Maven生命周期的灵活性 6. 结论         在Java开发中,Maven是一个不可或缺的工具,它通过自动化项目的构建、依赖管理和文档生成等任务,极大地提高了开发效率。Maven的核心之一是其构建生命周期,它定义了项目构建过程中的一系列阶段。在这篇文章中,我们将深

iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)

摘要 剪贴板同步能够提高很多的效率,免去复制、发送、复制、粘贴的步骤,只需要在手机上复制,就可以直接在电脑上 ctrl+v 粘贴,这方面在 Apple 设备中是做的非常好的,Apple 设备之间的剪贴板同步功能(Universal Clipboard)确实非常方便,它可以在 iPhone、iPad 和 Mac 之间无缝传输剪贴板内容,从而大大提高工作效率。 但是,iPhone 如何和 Wind

【前端】animation动画以及利用vue制作简单的透明度改变动画,包含vue生命周期实现

一. 问题描述 想做一个文字透明度从1到0然后再从0到1的css动画。 二. 代码写法 2.1 animation写法 2.1.1 animation属性key 2.1.2 代码展示 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=de

【C++多线程编程】 线程安全与对象生命周期管理

目录 类的线程安全 实现线程安全  构造函数在多线程中的安全性 析构函数多线程环境的安全 智能指针实现多线程安全  shared_ptr 非完全线程安全 shared_ptr可能导致对象生命周期延长 const引用可以减少传递shared_ptr开销 shared_ptr 智能指针块模块的优点  析构所在线程问题分析  RAII的使用 enable_shared_from_