iOS14開發-入門知識

iOS開發介紹

iOS 是由蘋果公司開發的移動操做系統 。蘋果公司最先於 2007 年 1 月 9 日的 Macworld 大會上公佈這個系統(最初叫 iPhone runs OS X)。該系統最初是設計給 iPhone 使用的(因此後來曾命名爲 iPhone OS),以後陸續套用到 iPod touch、iPad 以及 Apple TV 等產品上(因此在 WWDC 2010 上最終宣佈改名爲 iOS)。swift

iOS發展歷史

2007-2020 每一年發佈一個新版本,最新版本 iOS 14。數組

Apple官網與開發者網站

開發硬件

  • 蘋果電腦: iMac 或者 MacBook 或 Mac mini 主機鏈接一個顯示器。
  • 還能夠在普通電腦上裝一個黑蘋果系統(不推薦),安裝複雜且不穩定。

開發軟件

iOS 使用 Xcode 工具進行開發。能夠在 App Store 搜索安裝,也能夠去 Apple 開發者網站下載安裝(本教程基於 Xcode 12)。安全

開發語言

Swift 或者 Objective-C(本教程基於 Swift 5.x)。markdown

開發者帳號

  • 我的 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

  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(視圖)。session

UIView與UIViewController的關係

UIViewController 中默認有一個和屏幕同樣大的 UIView,UIViewController 管理着它的生命週期。全部放在界面上的 UI 控件都放在 UIViewController 的 UIView 之上,在 UIViewController 的代碼中能夠經過self.view屬性獲取它。開發中的其餘 UIView(及其子類)都放在該view上。app

UIViewController中UIView的生命週期函數

  • viewDidLoad:View 完成內存加載。
  • viewWillAppear:View 即將顯示。
  • viewDidAppear:View 徹底顯示。
  • viewWillDisappear:View 即將消失。
  • viewDidDisappear:View 完全消失。

UIView

iOS座標系

  • 二維座標系

座標系.png

  • z軸

獲取屏幕大小框架

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:全部子視圖。
思考:一個控件看不見有哪些可能?
  1. 寬度或者高度其實爲0。
  1. 位置不對(好比是個負數或者超大的數,已經超出屏幕)。
  2. hidden == true。
  3. alpha <= 0.01。
  4. 沒有設置背景色、沒有設置內容。
  5. 多是文字顏色和背景色同樣。

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
相關文章
相關標籤/搜索