iOS14開發-入門知識

yungfan· 2021-01-13

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

  1. 解析 Info.plist 獲得Application Scene Manifest,找到Main Storyboard file base name設置的 Storyboard。
  2. @main
  3. AppDelegate —> SceneDelegate。
  4. 顯示 Main.storyboard 中初始化的控制器。
Storyboard介紹
  • 容器概念。
  • is Initial View Controller(箭頭移動)。
  • Storyboard 中的界面與ViewController.swift之間的聯系(一個界面與一個類文件關聯)。

純代碼

  1. 刪除 Info.plist 中的Main Storyboard file base nameApplication Scene Manifest最里層的Storyboard Name。
  2. 解析 Info.plist 發現沒有設置 Main Storyboard。
  3. @main。
  4. AppDelegate —> SceneDelegate
  5. 在 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:所有子視圖。
思考:一個控件看不見有哪些可能?
  1. 寬度或者高度其實為0。
  2. 位置不對(比如是個負數或者超大的數,已經超出屏幕)。
  3. hidden == true。
  4. alpha <= 0.01。
  5. 沒有設置背景色、沒有設置內容。
  6. 可能是文字顏色和背景色一樣。

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 名字。
  • 錯誤信息
  1. @IBAction:unrecognized selector sent to instance
  2. @IBOutlet:this class is not key value coding-compliant for the key XXX
仙居天天乐棋牌下载 小黑板四肖中特八码 天津体彩泳坛夺金 湖南快乐十分开奖密码 捕鱼达人核弹能炸多少钱 捕鱼王3d 互联网彩票大奖兑奖 香港六合彩应用程式 一分赛车有什么技巧 篮球让分胜负算不算加时赛 山东新11选5 最大比特币平台 二八杠偷拍绝技 重庆时时彩开奖号码360 江苏7位数如何中奖号码 平码有哪些数 重庆百变王牌投注工具