iOS 之 UIKit

371 阅读6分钟

简介

UIKitStoryboardcode结合编写样式的一个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 控件复杂的界面逻辑

使用Storyboardcoding方式来创建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 LayoutUIKit的一个重要功能,它用于处理界面元素在不同设备上的布局适配。通过Auto Layout,你可以定义一组约束(constraints),这些约束描述了界面元素之间的相对位置尺寸关系,使得界面可以在不同的屏幕大小和方向上进行自适应布局

  • Storyboard进行可视化地Auto Layout 配置
  • coding编写NSLayoutConstraint等程序化布局代码

小结

使用UIKit 框架的一点优势就是这样,总是可以根据需求来选择是使用Storyboard还是coding来实现需求,不论是创建场景、UI 控件还是做适配。当然是优点也是缺点,因为同时通过Storyboardcoding修改有时会混淆,导致对页面的内容不清晰,需要在两处查看才能确定视图的最终表现