介绍
iOS 是由苹果公司开发的移动操作系统 。苹果公司最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统(最初叫 iPhone runs OS X)。该系统最初是设计给 iPhone 使用的(所以后来曾命名为 iPhone OS),之后陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上(所以在 WWDC 2010 上最终宣布更名为 iOS)。
iOS发展历史
2007-2020 每年发布一个新版本,最新版本 iOS 14(本教程基于 iOS 14)。
Apple官网与开发者网站
https://www.apple.com
https://developer.apple.com
开发硬件
苹果电脑:iMac 或者 MacBook 或 Mac mini 主机连接一个显示器。
还可以在普通电脑上装一个黑苹果系统(不推荐),安装复杂且不稳定。
开发软件
iOS 使用 Xcode 工具进行开发。可以在 App Store 搜索安装,也可以去 Apple 开发者网站下载安装(本教程基于 Xcode 12)。
开发语言
Swift 或者 Objective-C(本教程基于 Swift 5.x)。
开发者账号
个人 99 $/年
公司 99 $/年
企业 199 $/年
iOS系统四个层次

Core OS 是最为核心的系统层,包括了内存管理,文件系统,硬件管理,电源管理,安全管理等内容。
Core Services 包含了多种核心服务提供给 App 使用,如网络、线程、定位等。
Media 层主要包括了各种媒体文件的处理,通过它我们可以在应用程序中使用各种媒体文件,进行音频与视频的录制,图形的绘制,以及制作基础的动画效果。
Cocoa Touch 层为应用程序开发提供了各种有用的框架,并且大部分与用户界面有关,它负责用户在 iOS 设备上的触摸交互操作以及一些其他的关键功能。
创建第一个iOS项目

项目文件

App设置
应用名
项目 —> Target —> General —> Display Name
应用图标

启动屏 LaunchScreen
启动屏影响分辨率,可通过 LaunchScreen 删除验证。
模拟器

App初始化流程
AppDelegate
程序入口
@main
(iOS 14 以前是 @UIApplicationMain)didFinishLaunchingWithOptions
启动方法委托给
SceneDelegate
SceneDelegate
window
生命周期
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let _ = (scene as? UIWindowScene) else { return }
}
func sceneDidDisconnect(_ scene: UIScene) {
}
func sceneDidBecomeActive(_ scene: UIScene) {
}
func sceneWillResignActive(_ scene: UIScene) {
}
func sceneWillEnterForeground(_ scene: UIScene) {
}
func sceneDidEnterBackground(_ scene: UIScene) {
}
}
初始化
Main Storyboard
解析 Info.plist 获得
Application Scene Manifest
,找到Main Storyboard file base name
设置的 Storyboard。@main
AppDelegate —> SceneDelegate
显示 Main.storyboard 中初始化的控制器。
Storyboard介绍
容器概念
is Initial View Controller(箭头移动)
Storyboard 中的界面与
ViewController.swift
之间的联系(一个界面与一个类文件关联)
纯代码
删除 Info.plist 中的
Main Storyboard file base name
和Application Scene Manifest
最里层的Storyboard Name
。解析 Info.plist 发现没有设置 Main Storyboard。
@main。
AppDelegate —> SceneDelegate
在 SceneDelegate 的
willConnectToSession
中纯代码初始化 UIWindow,并设置显示的第一个控制器。window —> rootViewController —> UIViewController —> UIView
。
UIView与UIViewController
初步印象
iOS 开发中,一个界面就是一个 UIViewController(视图控制器),界面上显示的内容就是 UIView(视图)。
UIView与UIViewController的关系
UIViewController 中默认有一个和屏幕一样大的 UIView,UIViewController 管理着它的生命周期。所有放在界面上的 UI 控件都放在 UIViewController 的 UIView 之上,在 UIViewController 的代码中可以通过self.view
属性获取它。开发中的其他 UIView(及其子类)都放在该view
上。
UIViewController中UIView的生命周期函数
viewDidLoad
:View 完成内存加载viewWillAppear
:View 即将显示viewDidAppear
:View 完全显示viewWillDisappear
:View 即将消失viewDidDisappear
:View 彻底消失
UIView
iOS坐标系
二维坐标系

UIView添加到UIViewController的View

UIView的容器概念
UIView 中可以放其他的 UIView
UIView 的层次关系(平级与包含)
UIView常见属性
backgroudColor:背景色
frame:相对父视图的坐标和大小
bounds:相对自身的坐标和大小,所以 bounds 的 x 和 y 永远为0。
center:相对父视图的中心点坐标
alpha:透明度(0.0 ~ 1.0)
tag:标记(Int 类型,默认等于0),设置后,可以通过
所在容器View.viewWithTag
方法拿到这个视图。title:标题
superview:父视图
subviews:所有子视图
UIView常见方法
addSubview:添加视图到父视图
removeFromSuperview:将视图从父视图中移除(需提前讲解触摸方法)
viewWithTag:根据 tag 值获取视图
insertSubview:在指定视图的上/下面插入视图
bringSubviewToFront:把视图移到最顶层
exchangeSubviewAtIndex:将2个位置的视图互换
演示UIView与UIViewController
Storyboard
注意左侧面板的视图层次结构
属性面板的重要属性介绍
纯代码
与 Storyboard 属性面板的属性对应
注意代码的书写位置,往往有人由于书写的位置不对导致代码报错。
@IBOutlet与@IBAction
引入
如何在代码中获取 Storyboard 中的自定义 UIView?目前有两种方式:
通过 tag 属性:一旦视图多了,或者忘了设置 tag,亦或者设置了相同的 tag,都会出现问题。
通过 subviews 属性:一旦视图多了很难通过数组准确获取某个 View。
那么有没有更加友好、更加直观、更加便捷、更加高效的方法呢?答案是肯定的,那就是 @IBOutlet 与 @IBAction。
@IBOutlet
写于类中的属性。
与 Storyboard 中的 UIView 建立联系。
此时的属性就代表 Storyboard 中的 UIView
所有的 UI 控件都可以拖拽 @IBOutlet。
@IBAction
写于类中的方法。
与 Storyboard 中的 UIView 产生的事件建立联系。
当相应的事件发生时,方法就会被调用。
只有继承自 UIControl 的 UI 控件可以拖拽 @IBAction。
顺向与反向拖拽连线
顺向拖拽连线:通过 Storyboard 向类文件拖拽连线。
反向拖拽连线:通过类文件向 Storyboard 拖拽连线。
连线的前提
Storyboard 中的 UIViewController 与 想拖拽的类进行了关联。
经典的连线错误
UIView 连线后删除了类中的 @IBOutlet 或者 @IBAction。
UIView 连线后改变类中的 @IBOutlet 或者 @IBAction 名字。
错误信息
@IBAction:
unrecognized selector sent to instance
@IBOutlet:
this class is not key value coding-compliant for the key XXX