iOS14開發-入門知識
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官網與開發者網站
開發硬件
- 蘋果電腦: iMac 或者 MacBook 或 Mac mini 主機連接一個顯示器。
- 還可以在普通電腦上裝一個黑蘋果系統(不推薦),安裝復雜且不穩定。
開發軟件
iOS 使用 Xcode 工具進行開發??梢栽?App Store 搜索安裝,也可以去 Apple 開發者網站下載安裝(本教程基于 Xcode 12)。
開發語言
Swift 或者 Objective-C(本教程基于 Swift 5.x)。
開發者賬號
- 個人 99 $/年
- 公司 99 $/年
- 企業 299 $/年
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坐標系
- 二維坐標系
- z軸
獲取屏幕大小
UIScreen.main.bounds
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:所有子視圖。
思考:一個控件看不見有哪些可能?
- 寬度或者高度其實為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
溫馨提示
登錄后才可以操作哦,去登錄