iOS开发介绍
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。
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 $/年
- 企业 299 $/年
iOS系统四个层次
iOS系统四个层次.png
- Core OS 是最为核心的系统层,包括了内存管理,文件系统,硬件管理,电源管理,安全管理等内容。
- Core Services 包含了多种核心服务提供给 App 使用,如网络、线程、定位等。
- Media 层主要包括了各种媒体文件的处理,通过它我们可以在应用程序中使用各种媒体文件,进行音频与视频的录制,图形的绘制,以及制作基础的动画效果。
- Cocoa Touch 层为应用程序开发提供了各种有用的框架,并且大部分与用户界面有关,它负责用户在 iOS 设备上的触摸交互操作以及一些其他的关键功能。
创建第一个iOS项目
创建第一个iOS项目.png
项目文件
项目文件.png
App设置
- 应用名
- 项目 —> Target —> General —> Display Name
- 应用图标
应用图标.png
- 启动屏 LaunchScreen
- 启动屏影响分辨率,可通过 LaunchScreen 删除验证。
模拟器
模拟器.png
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坐标系
- 二维坐标系
坐标系.png
- z轴
代码语言:javascript复制获取屏幕大小
UIScreen.main.bounds
UIView添加到UIViewController的View
UIView添加到UIViewController的View.png
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:所有子视图。
思考:一个控件看不见有哪些可能?
- 宽度或者高度其实为0。
- 位置不对(比如是个负数或者超大的数,已经超出屏幕)。
- hidden == true。
- alpha <= 0.01。
- 没有设置背景色、没有设置内容。
- 可能是文字颜色和背景色一样。
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