UIKit 学习路线篇

2,634 阅读8分钟

引言

最近刚好有时间,就想着系统性地学习并整理一下 UIKit 的部分知识点,在之前参加内部近一个月 iOS 培训后整理出了一系列的文章:iOS 入门系列合集

除此之外,也有关于 Swift 语法的文章:Swift 那些特有的语法结构

以及关于部分 iOS 开发的小结文章:iOS 近期开发概念小结

但是这些文章大部分都是基于实际遇到不懂后总结而出的,因此在有一定时间的情况下和上过一段时间项目的基础上,想着结合实际的开发经验再次整体性的过一遍,但是这次稍有不同,是围绕着UIkit 框架展开的~

在编写本文章之前,我先梳理出了一篇文章:关于 UIkit 和 SwiftUI 那些用法不同但最后实现相同的概念合集,因为当我参考之前学习 SwiftUI 的路线来整理 UIkit 时,我发现部分知识我对应不上,因此便通过写本篇文章狠狠补了一下相关知识

当然,在阅读本篇文章前,个人还是十分建议将上面的文章都粗略的过一遍,对于初学者可以大概了解 iOS 相关知识,对于已经入门者则能达到知识巩固的效果,如果是资深开发者请留下您宝贵的建议~

学习路线

引言部分列举了一些个人总结的知识点,其实那些也是学习 UIkit 重要的参考资料,只是可能相对零散,此处便按照自己的理解罗列一下学习 UIkit 的知识路线,循序渐进的深入并打牢基础

UIkit 生命周期

UIkit 的生命周期有三类:视图生命周期、视图控制器生命周期、App 生命周期

在 UIKit 中,生命周期主要关注视图控制器的生命周期,因为视图控制器是管理视图的核心。视图控制器负责初始化视图、响应视图的加载和卸载、处理视图的显示和隐藏等操作。UIView 的生命周期也很重要,但更多地是受视图控制器的管理和影响

视图控制器的生命周期

  • viewDidLoad():视图控制器的视图已经加载到内存中,此时可以进行初始化设置
  • viewWillAppear(_:):视图即将显示在屏幕上
  • viewDidAppear(_:):视图已经显示在屏幕上
  • viewWillDisappear(_:):视图即将从屏幕上消失
  • viewDidDisappear(_:):视图已经从屏幕上消失
  • viewWillLayoutSubviews():视图控制器的视图即将重新布局
  • viewDidLayoutSubviews():视图控制器的视图已经重新布局
  • 处理视图的初始化、显示和隐藏等操作

视图的生命周期

  • layoutSubviews():当视图的子视图需要重新布局时调用
  • draw(_:):当视图需要绘制自己时调用
  • willMove(toSuperview:):当视图被添加到父视图时调用
  • didMoveToSuperview:当视图已经被添加到父视图时调用
  • willMove(toWindow:):当视图将被添加到窗口时调用
  • didMoveToWindow():当视图已经被添加到窗口时调用
  • 处理视图的布局和绘制

App 的生命周期

下面列出来了部分 App 的生命周期函数:

  • application(_:didFinishLaunchingWithOptions:):当应用程序启动时调用,用于初始化应用程序;这是应用程序生命周期的起始点
  • applicationDidBecomeActive(_:):当应用程序进入前台并成为活动状态时调用;这表示应用程序已经准备好与用户进行交互,可以继续之前暂停的任务
  • applicationWillResignActive(_:):当应用程序即将从活动状态转为非活动状态时调用,例如:接电话或收到通知时;这是暂停应用程序交互的时机
  • applicationDidEnterBackground(_:):当应用程序进入后台时调用;这表示应用程序已经不可见,可以在此时保存数据、释放资源,确保应用程序正确响应后台状态
  • applicationWillEnterForeground(_:):当应用程序从后台切换到前台时调用;这是恢复应用程序交互的时机
  • applicationWillTerminate(_:):当应用程序即将被终止时调用;用于执行清理操作,保存数据,确保应用程序的退出是干净的,这是应用程序生命周期的结束点
  • application(_:openURL:options:): 用于处理应用程序通过 URL 方式启动时的情况,允许应用程序在处理不同 URL 时执行不同操作
  • application(_:didRegisterForRemoteNotificationsWithDeviceToken:):当应用程序注册远程通知时调用,通常用于将设备令牌发送给远程通知服务器
  • application(_:didFailToRegisterForRemoteNotificationsWithError:):当应用程序无法注册远程通知时调用,通常用于处理注册失败的情况
  • application(_:didReceiveRemoteNotification:fetchCompletionHandler:):当应用程序接收到远程通知时调用,用于处理通知和执行相应操作

在 UIKit 中,App 的生命周期函数主要是通过UIApplicationDelegate协议来管理的,它包括了应用程序的各种状态和事件。当需要使用某个生命周期方法时可以去UIApplicationDelegate协议里查找,但由于UIApplicationDelegate协议是使用Objective-C编写的,因此在阅读时可能会有些困难,建议直接 copy 方法名去搜索如何使用

UIkit 三方库

Cocopods

iOS 之网络请求 一文的Cocopods 部分有关于 Cocopods 这个包管理器的简单描述,在此处再引入一些关于它的其他描述

首先,知道 Cocopods 是一个包管理器,管理着 iOS 开发相关的诸多三方库,这些三方库都有一个特点:具有一个有效的podspec文件,其中包含了库的名称、版本、依赖关系等信息

然后,在项目中,会有一个Podfile文件,通过pod来定义需要添加的依赖库,还可以通过source来指定仓库源,通过:git指定库的具体地址,target块用于分别指定不同模块的依赖关系

举例演示

#!/usr/bin/ruby
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/yourusername/YourPrivateRepo.git'

# 主应用程序目标
target 'YourApp' do
  platform :ios, '12.0'
  use_frameworks!

  # 主应用程序目标的依赖库声明
  pod 'UIKit'
  pod 'Alamofire', '~> 5.4'
  pod 'YourPrivateLibrary', :git => 'https://github.com/yourusername/YourPrivateLibrary.git'

  # 主应用程序目标的测试声明
  target 'YourAppTests' do
    inherit! :search_paths
    pod 'Quick', '~> 3.0'
    pod 'Nimble', '~> 8.0'
  end

  # 主应用程序目标的 UI 测试声明
  target 'YourAppUITests' do
    inherit! :search_paths
    pod 'XCTest', '~> 1.0'
  end
end

# 可选的其他目标块
target 'AnotherApp' do
  # ...
end

配置项解析:

  • platform :ios, '12.0':指定了项目支持的平台的最低版本,这里表示项目只能在 iOS 12.0 及更高版本的设备上运行
  • use_frameworks!:告诉 Cocopods 使用 Frameworks 来组织和管理依赖库
  • inherit! :search_paths:告诉 Cocopods 继承搜索路径

一般情况下,上面的配置项属于通用配置项,只需要在Podfile文件顶部配置一次,便可在target块之间共享这些配置项

Cocopods 通用指令

  • pod init:初始化项目,创建一个新的Podfile文件
  • pod install:安装项目中定义的依赖库
  • pod update:更新项目中的依赖库到最新版本
  • pod list:列出项目中当前安装的所有依赖库
  • pod spec create:创建一个新的依赖库的.podspec文件
  • pod spec lint:检查一个podspec文件是否合法
  • pod repo add:将一个私有仓库源添加到 Cocopods 仓库索引中
  • pod repo update:更新 Cocopods 仓库索引
  • pod repo list:列出项目中当前的仓库源

区别pod repo add指令和Podfile文件source引入

  • pod repo add将私有 CocoaPods 仓库添加到本地
  • Podfile文件中使用source指定这个私有 CocoaPods 仓库,以便项目可以访问私有库

简单总结一下就是:如果在项目的Podfile文件中使用source指定了一个私有库,但本地没有通过pod repo add添加过这个私有库,运行pod install时会报错,因为 CocoaPods 无法找到指定的私有库。所以在使用source指定私有库之前,确保已经通过pod repo add将这个私有库添加到本地

部分三方库简介

  • Alamofire:一个三方的网络请求库,iOS 之网络请求 一文中有关于它的讲解
  • SnapKit:一个用于简化自动布局的三方库,用法:
    class MyViewController: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // 创建一个视图
            let myView = UIView()
            myView.backgroundColor = .blue
            view.addSubview(myView)
    
            // 使用 SnapKit 创建约束
            myView.snp.makeConstraints { make in
                make.top.equalToSuperview().offset(20)
                make.left.equalTo(view.snp.left).offset(20)
                make.right.equalTo(view.snp.right).offset(-20)
                make.height.equalTo(100)
            }
        }
    }
    

其他的三方库没怎么使用过,等用到后再继续补充~