这是我参与「第四届青训营 」笔记创作活动的的第10天
App入门与UIKit简介(上)| 青训营笔记
App入门
main函数
// main.m
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
- App的入口,在main函数中将App的控制权交给UIKit框架
- UIApplicationMain创建核心对象
- 初始化一个UIApplication对象
- 初始化一个AppDelegate代理对象
UIApplication
- 单例模式,一个App中只有一个UIApplication对象
- 启动 Main RunLoop
- 创建事件队列:将用户产生的事件放入队列中依次处理
- 维护UIWindow列表(类似前端中通过DOM):获取所有视图
- 包含实现了UIApplicationDelegate协议的对象:处理App生命周期和系统事件
AppDelegate
- 单例模式,一个App中只有一个AppDelegate对象
- 响应来自应用程序外部的通知:内存不足警告、下载完成通知等
- 响应针对应用程序本身的事件:不是用户事件
生命周期
App生命周期
- App生命周期:5种状态
2,App生命周期钩子
- application:willFinishLaunchingWithOptions: 在App启动时调用表示应用加载进程已经开始,常用来处理应用状态的存储和恢复
- application:didFinishLaunchingWithOptions: 表示App将从未运行状态进入运行状态,用于对App的初始化操作
- applicationDidBecomeActive: 当应用即将进入前台运行时调用
- applicationWillResignActive: 当应用即将进从前台退出时调用
- applicationDidEnterBackground: 当应用开始在后台运行的时候调用
- applicationWillEnterForeground: 当程序从后台将要重新回到前台(但是还没变成Active状态)时候调用
- applicationWillTerminate: 当前应用即将被终止,在终止前调用的函数。通常是用来保存数据和一些退出前的清理工作。如果应用当前处在suspended,此方法不会被调用。 该方法最长运行时限为5秒,过期应用即被kill掉并且移除内存。
ViewController简介&生命周期
两种viewController
- contentViewController:在自己的view中,包含多个view,每个view负责页面的不同部分,在VC向view注入数据/从view中收集数据
- UIViewController
- containerViewController:在自己的view中,包含多个view controller,但每次仅展示一个或多个,提供方法用于在不同页面间切换
- UINavigationController
- 每个window只有一个根VC
VC主要生命周期
- Load阶段:只执行一次
- viewDidLoad:
- 将子view加入VC的view中
- 整个页面的VC,可以在此处埋点,pageID
- 不要将每次进入页面时都要重新执行的代码(如动画、数据加载)放在这个部分
- viewDidLoad:
- View即将呈现在屏幕上
- viewWillAppear:在这里更新view的内容,避免内容改变后需要重新layout
- viewWillLayoutSubviews
- viewDidLayoutSubviews
其他列举
- alloc:创建对象,分配空间
- init:初始化对象,初始化数据
- awakeFromNib:所有视图的outlet和action已经连接,但还没有被确定。
- loadView:完成一些关键view的初始化工作,加载view。
- viewDidLoad:载入完成,可以进行自定义数据以及动态创建其他控
- viewWillAppear:视图将出现在屏幕之前
- viewWillLayoutSubviews:将要对子视图进行调整
- viewDidLayoutSubviews:对子视图进行调整完毕
- viewDidAppear:视图已在屏幕上渲染完成
- viewWillDisappear:视图将被从屏幕上移除
- viewDidDisappear:视图已经被从屏幕上移除
- dealloc:视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释
- didReceiveMemoryWarning:内存警告
View更新UI
- 异步刷新:如果强制刷新布局,请调用 setNeedsLayout
- 可以将多个布局更新放到一个更新周期中,用来优化性能。
- 同步刷新:如果想马上刷新界面,请调用layoutIfNeeded
- 以上两种方法,都会调用layoutSubviews来进行重新布局,只有在自动布局和约束,不能满足需求时,才重写layoutSubviews
UIKit简介:
视图:UIView vs. CALayer
- CALayer:
- 不处理用户交互事件
- 负责管理图层位置、动画效果和变换等
- 最常用:制作阴影、圆角、带颜色边框
- UIView:
- 封装了CALayer
- 所有视图都继承自UIView
- U可以处理用户交互事件
未完待续