简介
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修改有时会混淆,导致对页面的内容不清晰,需要在两处查看才能确定视图的最终表现