简介
UIKit
是Storyboard
和code
结合编写样式的一个UI 框架
,在Storyboard 面板
中可以拖拽式
和连接可视化元素
来构建用户界面,还可以图示化
对各组件进行样式调整
和布局
概念
下面会从UIKit
的几个基础并且重要的知识概念出发,从而能够大致理清并了解UIKit 框架
的大致组成结构,达到在使用UIKit
这个框架时能够更加理性的目的
- Storyboard
- 场景
- 视图控制器
- 容器控制器
- 导航控制器
- 标签栏控制器
- 分屏控制器
- 分页控制器
- 场景入口
- UI 控件
- 生命周期
- Auto Layout
Storyboard
Storyboard
是一个界面构建工具
,能够可视化地设计和组织应用程序的界面
,以及定义界面之间的导航和交互关系
。Storyboard
可以包含多个视图控制器场景
,还可以创建
、连接
和管理
这些场景
以及它们之间的过渡关系
,还能实现自动布局
的效果
场景(Scene)
场景
这个概念在不同的上下文中可能有不同的含义。它可以是一个独立的视图控制器
、一个由多个视图控制器组成的容器控制器(如:导航控制器、标签栏控制器)
,甚至是一个自定义的交互体验单元
。因此,在理解和使用 场景
这个概念时,需要根据具体情况进行灵活的考虑
- 单个
视图控制器
:由一个视图控制器
和其包含的界面元素
组成场景
,特别是当它独立地提供了一个完整的用户交互体验
,而不需要依赖其他视图控制器
容器控制器
:导航控制器
和标签栏控制器
,包含了多个子视图控制器
的场景
容器控制器还包括:UIPageViewController(分页控制器)、UISplitViewController(分屏控制器)和 Custom Container View Controller(自定义容器视图控制器)
视图控制器(UIViewController)
视图控制器
是UIKit
用于管理用户界面的核心组件之一。每个视图控制器
负责管理一个界面
的显示
、交互
和逻辑
,从而构建用户友好的应用
容器控制器
容器控制器
是UIKit
中的一种特殊类型的视图控制器
,它可以管理其他视图控制器
的呈现
和切换
,从而实现复杂的用户界面布局
和导航
。容器控制器
主要用于创建分屏
、导航
、选项卡
等复杂的用户界面
- 导航控制器(UINavigationController):管理一个
导航堆栈
,用于实现层级导航
界面。它可以推入(push)和弹出(pop)视图控制器
,通常用于构建层级导航
、返回按钮
等 - 标签栏控制器(UITabBarController):以
标签栏
的形式显示多个视图控制器
,用户可以通过点击标签来切换不同的子视图控制器
,适用于分隔不同模块或功能
的界面 - 分屏控制器(UISplitViewController):主要用于
iPad
上的分屏显示
,可以同时显示两个视图控制器
,一个主要视图和一个次要视图,用户可以通过拖动分隔线
来调整主次视图的大小 - 分页控制器(UIPageViewController):管理
多个页面式的视图控制器
,用户可以通过滑动手势或其他交互来切换页面,适用于实现类似书籍翻页效果
的界面 - 自定义容器视图控制器(Custom Container View Controller):除了
UIKit
提供的容器控制器
外,你也可以创建自定义的容器控制器
,根据业务需求管理多个子视图控制器
的呈现
和切换
场景入口
通常一个应用程序有一个初始的场景
,即入口点
。指定程序入口有 2 种方式
Storyboard
中直接指定应用程序的入口界面
coding
的形式来指定程序入口,在AppDelegate.swift
中的application
方法中设置根视图控制器
,并将其作为窗口的根视图
;但是新版本iOS一般是在SceneDelegate中设置入口界面
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
// 创建一个视图控制器
let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()
let window = UIWindow(windowScene: windowScene)
window.rootViewController = viewController
self.window = window
window.makeKeyAndVisible()
}
}
UI 控件
UIKit
提供了许多不同类型的UI 控件
,它是用于构建丰富多样的用户界面的具体元素。UIKit
中的UI 控件
可以通过coding
方式创建,也可以通过Storyboard
提供的可视化界面进行拖拽式添加
Storyboard
可以在一个可视化界面中创建
和排列
各种UI 控件
,设置它们的属性
,定义它们之间的关系
,并设置事件
和转场
等。使界面的构建变得更加直观和方便,也方便了设计和开发团队之间的协作coding
在需要动态
生成界面或根据条件
来创建控件时更加灵活
和高效
,且也更容易实现自定义的UI 控件
和复杂的界面逻辑
使用Storyboard
或coding
方式来创建UI 控件
取决于个人偏好和项目需求。很多项目都会结合两种方式来创建界面,以便兼顾可视化编辑
和动态生成的灵活性
列举一些常见的UI 控件
:
- UIButton(按钮)
- UILabel(标签)
- UITextField(文本输入框)
- UITextView(文本视图)
- UIImageView(图像视图)
- UITableView(表格视图)
- UIScrollView(滚动视图)
- UINavigationBar(导航栏)
生命周期
按照视图的生命周期顺序列举其生命周期函数:
init?(coder:)
: 初始化loadView()
: 加载视图层级viewDidLoad()
: 视图加载完成viewWillAppear(_:)
: 视图即将显示viewDidAppear(_:)
: 视图已经显示viewWillDisappear(_:)
: 视图即将消失viewDidDisappear(_:)
: 视图已经消失didReceiveMemoryWarning()
: 接收到内存警告viewWillLayoutSubviews()
: 视图即将布局子视图viewDidLayoutSubviews()
: 视图已经布局子视图deinit
: 即将销毁
根据生命周期的函数名称便能大致了解到其何时会被执行,此处特别说明一下viewDisappear 组
和deinit
:
Disappear
是离开当前页面进入其它页面时会被触发deinit
是程序被关闭时会被触发
Auto Layout
Auto Layout
是UIKit
的一个重要功能,它用于处理界面元素在不同设备
上的布局
和适配
。通过Auto Layout
,你可以定义一组约束(constraints)
,这些约束
描述了界面元素之间的相对位置
和尺寸关系
,使得界面可以在不同的屏幕大小和方向
上进行自适应布局
Storyboard
进行可视化地Auto Layout 配置
coding
编写NSLayoutConstraint
等程序化布局代码
小结
使用UIKit 框架
的一点优势就是这样,总是可以根据需求来选择是使用Storyboard
还是coding
来实现需求,不论是创建场景、UI 控件
还是做适配
。当然是优点也是缺点,因为同时通过Storyboard
和coding
修改有时会混淆,导致对页面的内容不清晰,需要在两处查看才能确定视图的最终表现