日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【 iOS 应用开发 】 UIKit 控件 ( 代码生成控件 | UIView 属性方法 | Storyboard | Bundle | Property List | 动画 | 图片内存优化 )

發布時間:2025/6/17 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【 iOS 应用开发 】 UIKit 控件 ( 代码生成控件 | UIView 属性方法 | Storyboard | Bundle | Property List | 动画 | 图片内存优化 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一. 代碼生成控件
    • 1. 創建設置項目
      • ( 1 ) 創建項目 ( ① 選擇 Create a new Xcode project | ② 創建 Single View Application 項目 | ③ 設置項目信息 | ④ 設置代碼路徑并創建 )
      • ( 2 ) 界面設置 ( ① 選中 ViewController | ② 屬性查看器 -> Simulated Metrics -> Size | ③ 設置 iPhone 4.7-inch )
    • 2. 設置按鈕及添加事件
      • ( 1 ) 添加按鈕事件 ( Control + 左鍵 拖動到 代碼中 生成按鈕方法 )
      • ( 2 ) 修改按鈕文字 ( ① 雙擊控件 | ② 修改 Tittle 屬性 )
    • 3. 生成 UIView 控件 并 查看 View 層級
      • ( 1 ) 代碼 生成 UIView 控件 ( ① 創建控件 | ② 設置 frame | ③ 設置顏色 | ④ 添加控件 )
      • ( 2 ) 運行并查看效果 ( 查看 View 層次 )
    • 4. 代碼生成按鈕 并 綁定事件
      • ( 1 ) 代碼生成 按鈕 ( ① 創建按鈕控件 | ② 設置 frame | ③ 設置文字( 顏色 ) | ④ 設置背景( 前景 )圖片 | ⑤ 綁定事件 | ⑥ 添加控件 )
  • 二. UIView 屬性 和 子控件操作
      • ( 1 ) 創建 設置 應用 ( ① 創建應用 | ② 設置界面尺寸 )
      • ( 2 ) 設置 Main.storyboard UI 界面 ( ① 背景 )
      • ( 3 ) 在 ViewController.m 關聯 控件變量 ( ① 按住 Control 拖拽 控件 到 @interface 代碼塊中 | ② Connect 對話框 設置 名稱 類型 )
      • ( 4 ) 生成 子組件 代碼 ( ① 生成子組件 | ② 設置子組件屬性 | ③ 設置子組件 frame 屬性 [ 隨機位置生成 ] | ④ 添加子組件到父容器中 )
      • ( 5 ) 刪除 子組件 代碼 ( ① 獲取子組件數組 | ② 使用 for in 循環刪除子組件 | ③ isKindOfClass 判定組件類型 )
      • ( 6 ) 刪除 指定 Tag 的控件 的 代碼 ( ① 調用父控件的 viewWithTag 方法 | ② )
      • ( 7 ) UIView 常用方法屬性 ( ① tag 屬性 | ② removeFromSuperView 方法 | ③ addSubView 方法 | ④ viewWithTag 方法 | ⑤ frame 屬性 | ⑥ transform 屬性 )
      • ( 8 ) 效果展示
  • 三. 圖片瀏覽器
    • 1. 應用創建 設置
      • ( 1 ) 創建 設置 應用 ( ① 創建應用 | ② 設置界面尺寸 )
    • 2. UI 控件 設置
      • ( 1 ) 設置 Main.storyboard ( 拖入相關控件 )
      • ( 2 ) 關聯 Main.storyboard 與 ViewController.m ( ① 關聯控件變量 | ② 關聯方法 | ③ 設置相關的成員變量 )
    • 3. 相關知識點
      • ( 1 ) UILabel 設置 ( ① 換行設置 | ② 設置行高 | ③ 寬高控制 )
      • ( 2 ) UIButton 啟用 禁用 ( ① enabled 屬性 YES NO )
      • ( 3 ) NSArray 和 NSMutableDictionary 存儲數據 ( ① NSArray 數組 | ② 字典 )
    • 4. 代碼邏輯 與 完整代碼
      • ( 1 ) 代碼邏輯 ( ① 邊界處理 | ② 按鈕處理 | ③ UILabel 文字切換 | ④ UIImageView 圖片切換 )
      • ( 2 ) 完整代碼
      • ( 3 ) 效果展示
  • 四. Storyboard 添加 配置 及 相關知識點
    • 1. 添加 新界面 ( ① 新建 Storyboard | ② 配置 Storyboard | ③ 新建ViewController 代碼 )
      • ( 1 ) 添加 Storyboard ( ① File -> New -> File | ② iOS -> User Interface -> Storyboard | ③ General -> Deployment -> Main Interface 配置 Storyboard )
      • ( 2 ) Storyboard 設置 ( ① 拖動箭頭設置啟動界面 | ② View Controller 的 Is Initial View Controller 勾選框 設置啟動界面 | ③ 關聯 ViewController 代碼 )
      • ( 3 ) 新建 ViewController.m 文件 ( ① File -> New -> File | ② iOS -> Source -> Cocoa Touch Class | ③ Storyboard 中 身份查看器 配置 Class )
    • 2. Storyboard 相關知識點 ( ① 刪除 Storyboard | ② Storyboard 本質 )
      • ( 1 ) 刪除 Storyboard ( ① 刪除文件及引用 | ② 刪除引用 文件保留 )
      • ( 2 ) Storyboard 本質 ( XML 文本文件 )
    • 3. iOS 應用啟動步驟簡介
      • ( 1 ) iOS 應用啟動步驟
  • 五. Bundle 簡介
      • ( 1 ) Bundle 簡介
      • ( 2 ) 圖片放置 位置 ( ① 放在 Assets.xcassets [推薦] | ② 放在根目錄[不推薦] )
      • ( 3 ) NSBundle 使用 ( ① 獲取 NSBundle 對象 | ② 獲取 Bundle 目錄下 某文件的 全路徑 )
  • 六. Property List 簡介
      • ( 1 ) Property List 創建 ( ① New File | ② iOS -> Resource -> Property List | ③ 數據設置 | ④ 類型設置 )
      • ( 2 ) 獲取 Property List 數據 ( ① 獲取 Bundle PList 路徑 | ② dictionaryWithContentsOfFile 初始化字典 | ③ 查看數據 )
      • ( 3 ) Property List 多種類型 數據 設置 獲取 ( ① 設置 Root 類型為 NSArray | ② 設置 多類型 數據 | ③ 獲取 PList 的 Bundle 路徑 | ④ 初始化 數組 | ⑤ 打斷點查看數據 )
  • 七. 優化 圖片 瀏覽器 ( ① 使用 PList | ② 懶加載 )
      • ( 1 ) 使用 PList 存儲 數據 ( ① 創建 PList 文件 | ② 數據準備 | ③ 獲取 Bundle 路徑 | ④ 獲取 PList 的 Bundle 路徑 | ⑤ PList -> 數組 )
      • ( 2 ) 懶加載 優化 ( ① 在 get 方法中加載數據 | ② 如果為 空 才 加載 )
  • 八. UIImageView 播放動畫 及 內存優化
    • 1. 動畫 播放
      • ( 1 ) UIImageView 動畫 相關屬性 ( ① 圖片數組 | ② 動畫時長 | ③ 重復次數 )
      • ( 2 ) UIImageView 動畫 相關方法 ( ① 開始播放 | ② 停止播放 | ③ 是否正在播放 )
      • ( 3 ) UIImageView 動畫 執行流程 ( ① 準備 UIImage 數組 | ② 設置動畫參數 UIImage數組 時長 重復次數 | ③ 啟動動畫 )
    • 2. 圖片內存 優化
      • ( 1 ) UIImageView 動畫 內存 查看 ( ① Debug Navigator 查看內存 | ② 查看 動畫播放前后的內存變化 | ③ 分析內存不釋放的原因 )
      • ( 2 ) UIImage 內存分析 ( ① 使用 UIImage imageNamed:圖片名稱 加載圖片 | ② 使用 UIImage imageWithContentsOfFile:Bundle路徑名 加載圖片 )
      • ( 3 ) 內存優化 的 動畫 執行 完整流程 ( ① 準備 UIImage 數組 | ② 設置動畫參數 UIImage數組 時長 重復次數 | ③ 啟動動畫 | ④ 異步設置圖片數組為 nil )
      • ( 4 ) NSBundle pathForResource 為 nil 解決方案 ( ① 拖入目錄 選擇 Create gropus | ② 查看 Xcode 項目 配置 -> Build phases 的 Bundle 配置 )
      • ( 5 ) 效果展示




博客相關資源 :

  • 1.CSDN下載地址 : https://download.csdn.net/download/han1202012/10956883



一. 代碼生成控件



1. 創建設置項目


( 1 ) 創建項目 ( ① 選擇 Create a new Xcode project | ② 創建 Single View Application 項目 | ③ 設置項目信息 | ④ 設置代碼路徑并創建 )


項目創建流程 : ① 選擇 Create a new Xcode project , ② 創建 Single View Application 項目 , ③ 設置項目信息 , ④ 設置代碼路徑并創建 ;

  • 1.選擇項目創建 : 在 Xcode 歡迎界面中 , 點擊 Create a new Xcode project 選項 ;
  • 2.選擇項目類型 : 在 Choose a template for your new project 對話框中 , 選擇項目類型 iOS -> Application -> Single View Application 項目 ;
  • 3.設置項目名稱 : 輸入 項目 相關的 信息 , 主要是 項目名稱 ;
  • 4.選擇代碼存放路徑 : 選擇代碼存放路徑 , 點擊 Create 按鈕, 創建項目 ;


( 2 ) 界面設置 ( ① 選中 ViewController | ② 屬性查看器 -> Simulated Metrics -> Size | ③ 設置 iPhone 4.7-inch )

界面設置 : 需要自己手動設定一個 屏幕尺寸 ;

  • 1.創建后的默認 UI 設計界面 : 創建項目完成后, Main.storyboard 中顯示的是一個正方形的 界面 , 需要將其設置為 一個 手機形狀的 UI 界面 ;
  • 2.設置成 4.7 寸屏幕大小 : ① 選中 ViewController 圖標 , ② 設置 右側 的 屬性查看器 -> Simulated Metrics -> Size , ③ 選擇 iPhone 4.7-inch 屏幕大小 ;

  • 3.iPhone 尺寸 : ① iPhone 5 , 5S , SE : 4-inch ( 對角線長度 ) , ② iPhone 6 , 6S , 7 : 4.7-inch ( 對角線長度 ) , ③ iPhone 6 Plus , 6s Plus , 7Plus : 5.5-inch ( 對角線長度 ) ;



2. 設置按鈕及添加事件


( 1 ) 添加按鈕事件 ( Control + 左鍵 拖動到 代碼中 生成按鈕方法 )

添加按鈕事件 :

  • 1.添加按鈕 : 向 Main.storyboard 中拖入按鈕控件 ;
  • 2.生成按鈕方法 :
    • ① 打開輔助編輯器 : 同時顯示 Main.storyboard 和 ViewController.m 代碼 ;
    • ② 拖動生成方法 : 按住 Control 鍵 , 左鍵點擊 Button 控件不放 , 然后拖動到 ViewController.m 代碼空白處 ;
    • ③ 設置方法屬性 :
      • a . 在 Name 欄 設置 方法名稱 ;
      • b . 在 Event 欄 設置 方法觸發動作 ;
      • c . Touch Up Inside 即 點擊方法 ;
      • d . 在 Arguments 欄 設置需要傳入的參數 :
        • 1> 如果在方法中需要使用按鈕參數 , 則選擇 Sender ,
        • 2> 如果需要 按鈕 和 事件 參數 , 選擇 Sender and Event ,
        • 3> 如果不需要參數 , 設置 None 即可 ;
    • ④ 生成方法 : 點擊 上述 對話框中的 Connect 按鈕 , 即可生成對應方法 ;
  • 5.生成的代碼 :
- (IBAction)generateView { }

( 2 ) 修改按鈕文字 ( ① 雙擊控件 | ② 修改 Tittle 屬性 )


修改按鈕文字 :

  • 1.方法1 : 點擊選中 UIButton 控件, 然后再右側的屬性查看器中的 Tittle 屬性中修改按鈕文字 ;
  • 2.方法2 : 在 Main.storyboard 中雙擊 UIButton 控件 , 修改 按鈕文字 ;
  • 3.修改后 :



3. 生成 UIView 控件 并 查看 View 層級


( 1 ) 代碼 生成 UIView 控件 ( ① 創建控件 | ② 設置 frame | ③ 設置顏色 | ④ 添加控件 )


代碼生成 UIView 控件 :

  • 1.創建 UIView 控件 : 使用 UIView 的 alloc init 方法 , 創建 UIView 控件 ;
//1. 創建 View 控件 , 使用 alloc init 方法UIView * newView = [[UIView alloc] init];
  • 2.修改 Frame 屬性 : 使用 CGRectMake 方法創建 CGRect 結構體變量 , 并設置給 UIView 控件的 frame 屬性 ;
//2. 修改 控件 的 Frame 屬性newView.frame = CGRectMake(100, 100, 100, 100);
  • 3.設置顏色 : 設置 UIView 的 backgroundColor 屬性 , 傳遞一個 UIColor 對象 ;
//3. 為 控件 設置一個顏色值newView.backgroundColor = [UIColor redColor];
  • 4.添加 UIView 控件 : 獲取當前 ViewController 的 根 View 組件 , 然后將 生成的 UIView 控件添加到 該 根 View 控件中 ;
//4. 將 控件 添加到 View 中[self.view addSubview:newView];
  • 5.總體代碼 :
// // ViewController.m // 1.GenerateUIViewByCode // // Created by octopus on 19/2/3. // Copyright ? 2019年 han. All rights reserved. //#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib. }- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated. }- (IBAction)generateView {//1. 創建 View 控件 , 使用 alloc init 方法UIView * newView = [[UIView alloc] init];//2. 修改 控件 的 Frame 屬性newView.frame = CGRectMake(100, 100, 100, 100);//3. 為 控件 設置一個顏色值newView.backgroundColor = [UIColor redColor];//4. 將 控件 添加到 View 中[self.view addSubview:newView];}@end

( 2 ) 運行并查看效果 ( 查看 View 層次 )


運行并查看效果 :

  • 1.運行程序 : 點擊 Build and then run the current scheme 按鈕 , 運行虛擬機 ; 然后點擊 10 次 生成 10 個 UIView 控件 ;

  • 2.查看 創建的 View 層次 : 注意 該 步驟 必須在虛擬機運行之后才能操作 , 點擊下方的 Debug View Hierarchy 按鈕 , 即可查看 View 層次 ;

  • 3.查看 層次 : 鼠標 按住 界面 , 左右拖動 , 即可看到生成的 10 個 UIView 的層次 ;




4. 代碼生成按鈕 并 綁定事件


( 1 ) 代碼生成 按鈕 ( ① 創建按鈕控件 | ② 設置 frame | ③ 設置文字( 顏色 ) | ④ 設置背景( 前景 )圖片 | ⑤ 綁定事件 | ⑥ 添加控件 )


代碼生成 按鈕 :

  • 1.創建按鈕控件 : 創建 UIButton 控件時 , 需要制定按鈕類型 , 這里創建 Custom 類型的控件 ;
//1. 創建 某種 Type 的 按鈕 , 這里創建 UIButtonTypeCustom 類型的 按鈕UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
  • 2.設置 frame 屬性 : 使用 CGRectMake 方法創建 CGRect 結構體變量 , 并賦值給 按鈕的 frame 屬性 ;
//2. 設置 Frame 屬性button.frame = CGRectMake(100, 100, 100, 100);
  • 3.設置按鈕文字 : 調用 setTittle 方法 , 設置生成的按鈕的文字 ;
//3. 設置 文字 , 這里需要根據不同的狀態設置顯示的文字 , 這里只設置 UIControlStateNormal 狀態的文字[button setTitle:@"生成按鈕" forState:UIControlStateNormal];
  • 4.設置文字顏色 : 調用 setTittleColor 方法 , 設置按鈕文字的顏色 ;
//4. 設置 文字顏色 , 這里設置普通狀態時的 文字 顏色[button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
  • 5.設置背景圖片 :
    • ① 添加圖片資源 : 選中 Assets.xcassets , 從 Finder 中拖動圖片資源 到 其中 ;
    • ② 設置背景圖片 : 調用 setBackgroundImage 方法 , 設置背景圖片 ;
//5. 設置 背景圖片[button setBackgroundImage:[UIImage imageNamed:@"button_bg"] forState:UIControlStateNormal];
  • 6.綁定事件 : 創建一個方法 , 然后調用 UIButton 的 addTarget 綁定該方法 ;
//添加按鈕事件 //5. 設置 背景圖片[button setBackgroundImage:[UIImage imageNamed:@"button_bg"] forState:UIControlStateNormal];// 創建的按鈕事件 //為 生成的 按鈕 綁定 點擊事件 - (void) bindMethod{NSLog(@"綁定事件觸發"); }
  • 7.添加控件 : 獲取父控件 self.view , 調用父控件的 addView 方法 添加控件 ;
//7. 將 UIButton 添加到 根 View 中[self.view addSubview:button];
  • 8.完整代碼示例 :
// // ViewController.m // 1.GenerateUIViewByCode // // Created by octopus on 19/2/3. // Copyright ? 2019年 han. All rights reserved. //#import "ViewController.h"@interface ViewController ()@end@implementation ViewController//該方法在 UIViewController 創建完成 , 并開始加載到內存中時 , 在這個時刻執行該 viewDidLoad 方法 //一般情況下 是 在該方法中 執行 初始化數據 , 創建控件 等操作 ; - (void)viewDidLoad {[super viewDidLoad];//1. 創建 某種 Type 的 按鈕 , 這里創建 UIButtonTypeCustom 類型的 按鈕UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];//2. 設置 Frame 屬性button.frame = CGRectMake(100, 100, 100, 100);//3. 設置 文字 , 這里需要根據不同的狀態設置顯示的文字 , 這里只設置 UIControlStateNormal 狀態的文字[button setTitle:@"生成按鈕" forState:UIControlStateNormal];//4. 設置 文字顏色 , 這里設置普通狀態時的 文字 顏色[button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];//5. 設置 背景圖片[button setBackgroundImage:[UIImage imageNamed:@"button_bg"] forState:UIControlStateNormal];//6. 綁定 事件[button addTarget:self action:@selector(bindMethod) forControlEvents:UIControlEventTouchUpInside];//7. 將 UIButton 添加到 根 View 中[self.view addSubview:button]; }//為 生成的 按鈕 綁定 點擊事件 - (void) bindMethod{NSLog(@"綁定事件觸發"); }- (IBAction)generateView {//1. 創建 View 控件 , 使用 alloc init 方法UIView * newView = [[UIView alloc] init];//2. 修改 控件 的 Frame 屬性newView.frame = CGRectMake(100, 100, 100, 100);//3. 為 控件 設置一個顏色值newView.backgroundColor = [UIColor redColor];//4. 將 控件 添加到 View 中[self.view addSubview:newView];}@end



二. UIView 屬性 和 子控件操作



( 1 ) 創建 設置 應用 ( ① 創建應用 | ② 設置界面尺寸 )


創建 設置 應用 :

  • 1.創建應用 : ① 點擊 Create a new Xcode project 應用 ; ② 創建 Single View Application 項目 ; ③ 設置 項目名稱 , 組織標識 等信息 ; ④ 設置代碼路徑 ; 參考 一 . 1 . ( 1 ) 章節內容 ;
  • 2.設置界面尺寸 : ① Main.storyboard 界面中 選中 ViewController ; ② 在 屬性查看器中設置 Size 屬性為 iPhone 4.7-inch ; ③ 在 文件查看器 中取消 Use Auto Layout 選項 ;


( 2 ) 設置 Main.storyboard UI 界面 ( ① 背景 )


設置 Main.storyboard 界面 :

  • 1.設置背景顏色 : 選中 ViewController 下的 根 View 控件 , 在 屬性查看其中 設置 Background 屬性 , 設置一個顏色 ;
  • 2.向界面中添加一個 View 控件 : 添加 View 控件 當做容器 , 設置尺寸 300 x 300 , 居中顯示 , 之后將生成的 UIView 控件放在該 容器 中 ;
  • 3.添加按鈕 : 添加兩個按鈕 , 兩個按鈕的功能分別是 生成 UIView 控件 和 清空 UIView 控件 ;


( 3 ) 在 ViewController.m 關聯 控件變量 ( ① 按住 Control 拖拽 控件 到 @interface 代碼塊中 | ② Connect 對話框 設置 名稱 類型 )


關聯 ViewController.m 變量 :

  • 1.拖線關聯 : 按住 Control 鍵 不放 , 然后拖線到 ViewController.m 中的 @interface 代碼塊中 , 之后會彈出 Connect 對話框 ;

  • 2.設置變量信息 : 在 Connect 對話框中 設置 名稱 和 類型 , 然后點擊 Connect 按鈕 , 然后生成代碼 ;

  • 3.查看生成的代碼 : 點擊 Connect 按鈕后 , 會自動根據 類型 和 變量名 生成 對應的 代碼 ;



( 4 ) 生成 子組件 代碼 ( ① 生成子組件 | ② 設置子組件屬性 | ③ 設置子組件 frame 屬性 [ 隨機位置生成 ] | ④ 添加子組件到父容器中 )


生成子組件代碼 :

  • 1.創建子組件 : 調用 UILabel 的 alloc init 方法 , 生成子組件 ;
//1. 創建 UILabel 類型子組件UILabel * label = [[UILabel alloc] init];
  • 2.設置子組件 : 設置子組件信息 , 為 UILabel 設置文字 ;
//2. 設置 子組件 信息label.text = @"生成的子組件";
  • 3.設置 frame 屬性 : 設置隨機的位置 , 使用 arc4random_uniform 函數生成隨機數 , x 坐標 和 y 坐標要使用不同的 隨機值 , 之后設置一個 寬高 即可 ;
//3. 設置 frame 屬性 , 主要是設置 位置 和 大小 , 這里針對位置 設置一個隨機位置// 隨機數使用 arc4random_uniform 是用于生成隨機數的函數label.frame = CGRectMake(arc4random_uniform(200), arc4random_uniform(280), 150, 20);
  • 4.添加到父容器 : 將代碼添加到 父容器 中 ;
//4. 添加到 Container 中[self.Container addSubview:label];
  • 5.整體代碼 :
// 添加 子組件 // ① 添加組件 : 調用 父容器組件 的 addSubview 方法添加子組件 - (IBAction)generateView:(UIButton *)sender {//1. 創建 UILabel 類型子組件UILabel * label = [[UILabel alloc] init];//2. 設置 子組件 信息label.text = @"生成的子組件";//3. 設置 frame 屬性 , 主要是設置 位置 和 大小 , 這里針對位置 設置一個隨機位置// 隨機數使用 arc4random_uniform 是用于生成隨機數的函數label.frame = CGRectMake(arc4random_uniform(200), arc4random_uniform(280), 150, 20);//4. 添加到 Container 中[self.Container addSubview:label]; }

( 5 ) 刪除 子組件 代碼 ( ① 獲取子組件數組 | ② 使用 for in 循環刪除子組件 | ③ isKindOfClass 判定組件類型 )


刪除子組件代碼 :

  • 1.獲取子組件數組 : 訪問 父容器的 subViews 屬性 即可獲取 父容器所有的子組件, 該屬性在 UIView 中定義 ;
self.Container.subviews
  • 2.刪除子組件 : 使用 removeFromSuperView 方法 來 刪除控件 ;
[view removeFromSuperview];
  • 3.控件類型準備 : 父容器中添加 UIButton 組件 , 用于區分 UILabel 和 UIButton , 這里只刪除 UILabel 控件 ;
  • 4.判定組件類型 : 使用 isKindOfClass 判斷 對象 類型 ;
[view isKindOfClass:[UIButton class]]
  • 5.刪除所有 UILabel 控件 : 使用 for in 循環 刪除所有的 UILabel 控件 ;
//1. 獲取所有的子組件數組 , 直接遍歷刪除每個子組件即可 , 注意不刪除 UIButton 類型的組件for(UIView * view in self.Container.subviews){[view removeFromSuperview];}
  • 6.完整代碼 :
// 刪除 子組件 // ① 刪除方法 : 使用 removeFromSuperView 方法 來 刪除控件 // ② 獲取子組件 : 訪問 父容器的 subViews 屬性 即可獲取 父容器所有的子組件, 該屬性在 UIView 中定義 // ③ 判定組件類型 : 通過調用 [uiView isKindOfClass:[UIButton class]] 方法可以判斷 uiView 是否是 UIButton 類型的組件 - (IBAction)clearView:(UIButton *)sender {//1. 獲取所有的子組件數組 , 直接遍歷刪除每個子組件即可 , 注意不刪除 UIButton 類型的組件for(UIView * view in self.Container.subviews){[view removeFromSuperview];}}

( 6 ) 刪除 指定 Tag 的控件 的 代碼 ( ① 調用父控件的 viewWithTag 方法 | ② )


刪除指定 Tag 的控件 :

  • 1.生成方法 : 按住 Control 拖線關聯 , 在 Connect 對話框 設置方法參數 , 生成方法 ;
  • 2.控件準備 : 拖入 3 個 Label 控件 , 分別設置 Tag 屬性 1 , 2, 3 ;
  • 3.獲取子控件方法 : 調用父控件的 viewWithTag 方法 獲取指定 Tag 屬性的子組件 , 如果 父控件 的 Tag 與 子控件的 Tag 相同 , 也能獲取到 , 并且優先獲取父控件 ; 如果刪除父控件 , 那么其子控件也會被全部刪除 ;
  • 4.刪除控件 : 調用獲取的子控件的 removeFromSuperview 方法 , 刪除控件 ;
  • 5.代碼示例 :
- (IBAction)clearTag:(UIButton *)sender {//1. 獲取指定 Tag 的控件UILabel * label1 = [self.Container viewWithTag:1];UILabel * label2 = [self.Container viewWithTag:2];UILabel * label3 = [self.Container viewWithTag:3];//2. 刪除 子控件[label1 removeFromSuperview];[label2 removeFromSuperview];[label3 removeFromSuperview];}

( 7 ) UIView 常用方法屬性 ( ① tag 屬性 | ② removeFromSuperView 方法 | ③ addSubView 方法 | ④ viewWithTag 方法 | ⑤ frame 屬性 | ⑥ transform 屬性 )


UIView 常用方法屬性 :

  • 1.tag 屬性 : 用于標示控件 , 不能改變控件外觀 ;
  • 2.removeFromSuperView 方法 : 將 子控件 從 父控件 刪除 ;
  • 3.addSubView 方法 : 向 父控件 中 添加子控件 , 還需要設置 Frame屬性 才能顯示 ;
  • 4.viewWithTag 方法 : 獲取 指定 Tag 屬性的 子控件 , 如果 父控件 也是這個 Tag , 那么優先獲取自己 ;
  • 5.frame 屬性 : 定義控件的位置 和 尺寸 ;
  • 6.transform 屬性 : 改變 位置 , 大小 , 旋轉角度 屬性 ; 有兩種使用方式 , 一種是 直接創建指定所有參數 ; 第二種 可以在之前的基礎上進行增量修改 ;


( 8 ) 效果展示


效果展示 :





三. 圖片瀏覽器



1. 應用創建 設置


( 1 ) 創建 設置 應用 ( ① 創建應用 | ② 設置界面尺寸 )


創建 設置 應用 :

  • 1.創建應用 : ① 點擊 Create a new Xcode project 應用 ; ② 創建 Single View Application 項目 ; ③ 設置 項目名稱 , 組織標識 等信息 ; ④ 設置代碼路徑 ; 參考 一 . 1 . ( 1 ) 章節內容 ;
  • 2.設置界面尺寸 : ① Main.storyboard 界面中 選中 ViewController ; ② 在 屬性查看器中設置 Size 屬性為 iPhone 4.7-inch ; ③ 在 文件查看器 中取消 Use Auto Layout 選項 ;



2. UI 控件 設置


( 1 ) 設置 Main.storyboard ( 拖入相關控件 )


設置 Main.storyboard 界面 :

  • 1.準備對應控件 : 根據需求 拖入 對應的控件 , 并設置相關屬性 ; 這里就不再詳細介紹 , 貼一張 設置好的控件 和 默認文字 圖片 展示圖 ;
  • 2.準備素材 : 拖入 顯示的圖片 和 箭頭 等 圖片資源 ;


( 2 ) 關聯 Main.storyboard 與 ViewController.m ( ① 關聯控件變量 | ② 關聯方法 | ③ 設置相關的成員變量 )


關聯 Main.storyboard 與 ViewController.m :

  • 1.關聯控件變量 : 按住 Control 鍵 , 將控件拖動到 @interface 代碼區域 , 在彈出的對話框中輸入控件命令 和 選擇控件類型 , 即可生成控件關聯的變量 ;
// 顯示圖片的索引 @property (weak, nonatomic) IBOutlet UILabel *indexLabel;// 顯示圖片 @property (weak, nonatomic) IBOutlet UIImageView *Image;// 左箭頭按鈕 @property (weak, nonatomic) IBOutlet UIButton *lastButton;// 右箭頭按鈕 @property (weak, nonatomic) IBOutlet UIButton *nextButton;// 圖片介紹 @property (weak, nonatomic) IBOutlet UILabel *imageDescription;
  • 2.關聯 UIButton 點擊方法 : 按住 Control 鍵 , 將控件拖動到 @implementation 代碼區域 , 在彈出的對話框中 輸入方法名稱 , 選擇控件類型 , 選擇觸發操作 , 選擇傳入的參數 即可生成點擊方法 ;
// 上一張 圖片 - (IBAction)lastImage:(UIButton *)sender { }// 下一張 圖片 - (IBAction)nextImage:(UIButton *)sender { }


3. 相關知識點


( 1 ) UILabel 設置 ( ① 換行設置 | ② 設置行高 | ③ 寬高控制 )


UILabel 設置 :

  • 1.設置自動換行 : 在 UILabel 中有 Lines 屬性 , 可以設置顯示 幾行 文字 , Lines 屬性 設置 0 就會自動進行換行 ;
  • 2.UILabel 行高設置 : 自動換行的前提是 , UILabel 有對應的多行的行高 , 如果 UILabel 高度很小只能顯示 1 行 , 那么 UILabel 自動換行 也只是顯示 1 行 , 因此 如果需要自動換行的話 , 需要給 UILabel 設置足夠的行高 ;

  • 3.寬高控制 : UILabel 的 寬度 和 高度 都需要把握好 , 寬度如果不夠 , 后面會出現 … 的 省略情況 , 同理 高度不足 也會出現這種情況 ;


( 2 ) UIButton 啟用 禁用 ( ① enabled 屬性 YES NO )


UIButton 的啟用 禁用 :

  • 1.enabled 屬性 ( 可視化修改 ) : 在 UIButton 的 屬性查看器中 Control 模塊下 , Enabled 屬性用來設置 按鈕是否可用 , 如果 勾選 按鈕可用 , 反之 按鈕 會變灰 不可用 ;
  • 2.源碼中查看 enabled 屬性 : 默認是 YES 可用 , 如果設置為 NO 不可用 ;
@property(nonatomic,getter=isEnabled) BOOL enabled; // default is YES. if NO, ignores touch events and subclasses may draw differently
  • 3.代碼修改 enabled 屬性 : 方法中 直接修改 sender.enabled 屬性值 為 YES 或 NO , 即可修改 UIButton 是否可用 ;


( 3 ) NSArray 和 NSMutableDictionary 存儲數據 ( ① NSArray 數組 | ② 字典 )


NSArray 和 NSMutableDictionary 存儲數據 :

  • 1.使用方法 : 定義一個 NSArray 成員變量 , 其每個元素都是一個 NSMutableDictionary 字典 , 字典中存放 兩個 鍵值對 , 分別是 圖片名稱 和 圖片描述 ;
  • 2.定義 NSArray 成員變量 : 使用 @property 定義 , 注意
// 用于保存所有圖片數據的數組 , 每個數組元素存放字典數據 @property (strong, nonatomic) NSArray * pics;
  • 3.初始化 NSArray 成員變量 : 先逐個創建對應的 NSMutableDictionary 字典 , 然后將字典 當做元素 放入 NSArray 數組中 , 數組中的每個元素都是一個 字典 ;
// 1. 初始化圖片名稱數組NSMutableDictionary * d1 = [NSMutableDictionary dictionary];d1[@"pic"]=@"1_Mustang";d1[@"des"]=@"Mustang(福特野馬)是美國福特汽車公司推出的2005款野馬汽車,最高時速232.2公里,設計源自2003 年汽車巡回展上的概念車,野馬的誕生標志著美國僅存的大馬力轎車獲得了重生。";NSMutableDictionary * d2 = [NSMutableDictionary dictionary];d2[@"pic"]=@"2_Prado";d2[@"des"]=@"普拉多是一款進口ORV,源于豐田享譽全球的LAND CRUISER車系,1996年豐田正式將LAND CRUISER FJ90命名為PRADO普拉多,即真正意義上的第一代普拉多。";NSMutableDictionary * d3 = [NSMutableDictionary dictionary];d3[@"pic"]=@"3_Camaro";d3[@"des"]=@"雪佛蘭 科邁羅(英文名:Chevrolet Camaro)設計于1960年,目前共發展了六代。1966年9月26日發布的1967款Camaro是以雪佛蘭Nova為原型而設計的。";NSMutableDictionary * d4 = [NSMutableDictionary dictionary];d4[@"pic"]=@"4_LandCru";d4[@"des"]=@"蘭德酷路澤【陸地巡洋艦】是豐田汽車出品的LAND CRUISER 200,是豐田公司生產的一款進口ORV越野車(Off Road Vehicle) [1] ,它的外觀在繼承原有設計DNA的同時向具備新時代的“新鮮感·先進性”風格進化。是四輪驅動,軸距2850毫米,四輪碟剎的硬派越野車。";NSMutableDictionary * d5 = [NSMutableDictionary dictionary];d5[@"pic"]=@"5_Mondeo";d5[@"des"]=@"福特蒙迪歐(Mondeo)是一款長安福特旗艦車型,不僅搭載多項創新科技,并在至臻品質、動力系統以及安全性能等方面實現全面提升。";// 將字典放入數組中self.pics = @[d1, d2, d3, d4, d5];
  • 4.獲取 NSArray 中的元素 : 根據數組下標 [int] 獲取數組中的元素 ;
// ① 獲取對應的數據 字典NSMutableDictionary * d = self.pics[self.index - 1];
  • 5.從 NSMutableDictionary 字典 中獲取對應元素 : 獲取 NSMutableDictionary * d 字典中的 “pic” 鍵 對應的值 d[@"pic"] , 獲取 字典 中 “des” 鍵 對應的值 d[@"des"]



4. 代碼邏輯 與 完整代碼


( 1 ) 代碼邏輯 ( ① 邊界處理 | ② 按鈕處理 | ③ UILabel 文字切換 | ④ UIImageView 圖片切換 )


代碼邏輯 :

  • 1.索引邊界處理 : 索引范圍 1 ~ 5 , 不能 小于 1 或者 大于 5 , 這里需要進行限制 ; 點擊 向左 切換時 索引自減 , 當 小于等于 1 時 , 索引值 仍為 1 ; 點擊向右切換時 , 索引 自增 , 當 大于等于 5 時 , 索引值 仍為 5 ;
// 設置圖片索引 , 注意不能 小于 1 , 邊界控制self.index -- ;if(self.index <= 1){self.index = 1;}...// 設置圖片索引 , 注意不能 超過 5 , 邊界控制self.index ++ ;if(self.index >= self.pics.count){self.index = (int)self.pics.count;}
  • 2.按鈕處理 : UIButton 的 enabled 屬性 設置 YES NO 值 來 設置 可用 禁用 屬性 ; 顯示第一張圖片時 , 左 按鈕 禁用 , 顯示 最后一張圖片時 , 右 按鈕 禁用 ; 其它情況 左右按鈕 都可用 ;
// 1. 設置按鈕 禁用 啟用 , index 為 1 和 5 時 分別啟用 和 禁用 指定的按鈕 , 其它情況下可以使用兩個按鈕if(self.index == 1){self.lastButton.enabled = NO;self.nextButton.enabled = YES;}else if(self.index == self.pics.count){self.lastButton.enabled = YES;self.nextButton.enabled = NO;}else{self.lastButton.enabled = YES;self.nextButton.enabled = YES;}
  • 3.UILabel 文字切換 : 直接 修改 UILabel 的 text 屬性 ;
// ④ 設置 文字 描述self.imageDescription.text = d[@"des"];
  • 4.文字生成格式 : 使用 NSString 的 stringWithFormat 方法 , 設置一個 字符串格式 , 使用 通配符 進行 數據替換 ; 注意 NSArray 的 count 的通配符是 %lu ;
// ② 設置提示 UILabel 文字 , 拼接字符串 , 1/5self.indexLabel.text = [NSString stringWithFormat:@"%d/%lu", self.index, self.pics.count];
  • 5.UIImageView 圖片切換 : 通過 調用 UIImage 的 imageNamed 方法 , 獲取 UIImage 對象 ;
// ③ 設置 圖片 顯示self.Image.image = [UIImage imageNamed:d[@"pic"]];

( 2 ) 完整代碼


完整代碼 :

// // ViewController.m // 3.ImageBrowser // // Created by octopus on 19/2/11. // Copyright ? 2019年 han. All rights reserved. //#import "ViewController.h"@interface ViewController ()// 顯示圖片的索引 @property (weak, nonatomic) IBOutlet UILabel *indexLabel;// 顯示圖片 @property (weak, nonatomic) IBOutlet UIImageView *Image;// 左箭頭按鈕 @property (weak, nonatomic) IBOutlet UIButton *lastButton;// 右箭頭按鈕 @property (weak, nonatomic) IBOutlet UIButton *nextButton;// 圖片介紹 @property (weak, nonatomic) IBOutlet UILabel *imageDescription;// 當前圖片索引 @property (assign, nonatomic) int index;// 用于保存所有圖片數據的數組 , 每個數組元素存放字典數據 @property (strong, nonatomic) NSArray * pics;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// 1. 初始化圖片名稱數組NSMutableDictionary * d1 = [NSMutableDictionary dictionary];d1[@"pic"]=@"1_Mustang";d1[@"des"]=@"Mustang(福特野馬)是美國福特汽車公司推出的2005款野馬汽車,最高時速232.2公里,設計源自2003 年汽車巡回展上的概念車,野馬的誕生標志著美國僅存的大馬力轎車獲得了重生。";NSMutableDictionary * d2 = [NSMutableDictionary dictionary];d2[@"pic"]=@"2_Prado";d2[@"des"]=@"普拉多是一款進口ORV,源于豐田享譽全球的LAND CRUISER車系,1996年豐田正式將LAND CRUISER FJ90命名為PRADO普拉多,即真正意義上的第一代普拉多。";NSMutableDictionary * d3 = [NSMutableDictionary dictionary];d3[@"pic"]=@"3_Camaro";d3[@"des"]=@"雪佛蘭 科邁羅(英文名:Chevrolet Camaro)設計于1960年,目前共發展了六代。1966年9月26日發布的1967款Camaro是以雪佛蘭Nova為原型而設計的。";NSMutableDictionary * d4 = [NSMutableDictionary dictionary];d4[@"pic"]=@"4_LandCru";d4[@"des"]=@"蘭德酷路澤【陸地巡洋艦】是豐田汽車出品的LAND CRUISER 200,是豐田公司生產的一款進口ORV越野車(Off Road Vehicle) [1] ,它的外觀在繼承原有設計DNA的同時向具備新時代的“新鮮感·先進性”風格進化。是四輪驅動,軸距2850毫米,四輪碟剎的硬派越野車。";NSMutableDictionary * d5 = [NSMutableDictionary dictionary];d5[@"pic"]=@"5_Mondeo";d5[@"des"]=@"福特蒙迪歐(Mondeo)是一款長安福特旗艦車型,不僅搭載多項創新科技,并在至臻品質、動力系統以及安全性能等方面實現全面提升。";// 將字典放入數組中self.pics = @[d1, d2, d3, d4, d5];// 2. 初始化索引 為 1 , 并且執行 第一次 圖片 切換 操作 , 顯示對應的 圖片 , 索引 , 及 描述self.index = 1;[self showImage];}// 顯示 上一張 圖片 - (IBAction)lastImage:(UIButton *)sender {// 設置圖片索引 , 注意不能 小于 1 , 邊界控制self.index -- ;if(self.index <= 1){self.index = 1;}[self showImage]; }// 顯示 下一張 圖片 - (IBAction)nextImage:(UIButton *)sender {// 設置圖片索引 , 注意不能 超過 5 , 邊界控制self.index ++ ;if(self.index >= self.pics.count){self.index = (int)self.pics.count;}[self showImage]; }// 根據 當前的 索引值 顯示指定的圖片 , 以及控制 左右 切換按鈕是否可用 - (void) showImage {// 1. 設置按鈕 禁用 啟用 , index 為 1 和 5 時 分別啟用 和 禁用 指定的按鈕 , 其它情況下可以使用兩個按鈕if(self.index == 1){self.lastButton.enabled = NO;self.nextButton.enabled = YES;}else if(self.index == self.pics.count){self.lastButton.enabled = YES;self.nextButton.enabled = NO;}else{self.lastButton.enabled = YES;self.nextButton.enabled = YES;}// 2. 設置 UIImageView 和 UILabel 切換// ① 獲取對應的數據 字典NSMutableDictionary * d = self.pics[self.index - 1];// ② 設置提示 UILabel 文字 , 拼接字符串 , 1/5self.indexLabel.text = [NSString stringWithFormat:@"%d/%lu", self.index, self.pics.count];// ③ 設置 圖片 顯示self.Image.image = [UIImage imageNamed:d[@"pic"]];// ④ 設置 文字 描述self.imageDescription.text = d[@"des"];}@end

( 3 ) 效果展示


效果展示 :





四. Storyboard 添加 配置 及 相關知識點



1. 添加 新界面 ( ① 新建 Storyboard | ② 配置 Storyboard | ③ 新建ViewController 代碼 )


( 1 ) 添加 Storyboard ( ① File -> New -> File | ② iOS -> User Interface -> Storyboard | ③ General -> Deployment -> Main Interface 配置 Storyboard )


Main.storyboard 添加流程 :

  • 1.新建 : 菜單欄 File -> New -> File 選項 , 彈出 新建 對話框 ;
  • 2.選擇文件模板 : 在彈出的 對話框中 選擇 iOS -> User Interface -> Storyboard 文件 , 點擊 Next 按鈕 , 進行下一步設置 ;
  • 3.選擇文件路徑 : 最好將文件放在 主代碼 路徑下 , 點擊 Create 進行下一步 ;
  • 4.Xcode 設置 : 其 文件 創建在了 代碼目錄下 , Xcode 中的引用 放在了根目錄 , 此時 將其拖動到 代碼路徑中即可 ;

    設置完畢后的情況 :
  • 5.設置啟動 UI 文件 : 選中 Xcode 項目 根路徑文件 , 在 General -> Deployment -> Main Interface 一欄 選擇 想要啟動的 UI 文件 ;


( 2 ) Storyboard 設置 ( ① 拖動箭頭設置啟動界面 | ② View Controller 的 Is Initial View Controller 勾選框 設置啟動界面 | ③ 關聯 ViewController 代碼 )


Storyboard 設置 :

  • 1.設置多個 View Controller : 在 Main.storyboard 中 , 可以直接將 View Controller 拖入其中 ; 注意 為 每個 ViewController 設置 4.7inch 大小 ;
  • 2.設置 3 個 View Controller : 拖入 三個 ViewController , 并為其 根 View 設置 不同的背景顏色 ;
  • 3.拖動箭頭 : 直接拖動 向右的 箭頭 , 其指向就是第一個 啟動的界面 ;
  • 4.屬性設置啟動界面 : 選中 ViewController , 在屬性查看器中 設置 View Controller 模塊下的 Is Initial View Controller 選項 ;
  • 5.關聯 ViewController 代碼 : 在 Main.Storyboard 中 雖然添加了 2 個 界面 , 但是沒有與之對應的 ViewController.m 的代碼 , 這里需要在 身份查看器 中 設置 Class 屬性 ;



( 3 ) 新建 ViewController.m 文件 ( ① File -> New -> File | ② iOS -> Source -> Cocoa Touch Class | ③ Storyboard 中 身份查看器 配置 Class )


新建 ViewController.m 文件 :

  • 1.新建文件 : 菜單欄 File -> New -> File 選項 , 彈出 新建對話框 ;
  • 2.創建類型選擇 : 在彈出的 對話框中 選擇 iOS -> Source -> Cocoa Touch Class 文件 , 點擊 Next 按鈕 , 進行下一步設置 ;
  • 3.設置類 : 選擇 父類 類型為 UIViewController , 類名不要與其它 文件 重名 , 點擊 Next 進行下一步設置 ;
  • 4.設置文件路徑 : 在 彈出 的 對話框中 設置代碼的路徑 , 這里直接使用默認值即可 ; 點擊 Create 按鈕 , 即可生成 對應的 ViewController 代碼 文件 ;
  • 5.Storyboard 代碼對應設置 : 點擊 Storyboard 中的 ViewController , 在 身份查看器 中配置 Class 選項 , 直接輸入 剛才生成的 TestViewController 名稱即可完成對應關系 ;



2. Storyboard 相關知識點 ( ① 刪除 Storyboard | ② Storyboard 本質 )


( 1 ) 刪除 Storyboard ( ① 刪除文件及引用 | ② 刪除引用 文件保留 )


刪除 Storyboard : 選中 Storyboard 點擊 Delete 鍵 , 就會彈出如下對話框 , 提供了 三個選項 ;

  • 1.Move to Trash : 刪除 Finder 中的 文件 , 及 Xcode 中的索引 , 該文件直接刪除到 Trash 廢紙簍 中 ;
  • 2.Remove Reference : 刪除 Xcode 中的 引用 , 但是 文件 還是 在 該項目 下 , 可以隨時 通過 拖動 恢復該文件 ;
  • 3.Cancel : 取消刪除操作 ;


( 2 ) Storyboard 本質 ( XML 文本文件 )


Storyboard 本質 : 向 首界面 拖入 一個 UILabel , 并查看 該文件 ;

  • 1.使用文本編輯器查看 : 使用 Subline 文本編輯器查看 Storyboard 界面 , 發現 其本質 是一個 純文本 的 文件 ; 該方式 與 Android 的 布局文件相似 ;
  • 2.xml 文本 : 該 文本 本質 是 一個 xml 文件 ;
  • 3.Xcode 中使用文本打開 : 右鍵點擊 Storyboard 文件 , 選擇 Open As -> Source Code 即可 查看 源碼 ;
  • 4.查看 代碼 樣式 :
  • 5.UILabel 代碼 分析 : 其中 text 屬性 就是 顯示 文字 , rect frame 子標簽 就是其 位置 和 寬高 ;
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Hello" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JUr-dt-qtd"> <rect key="frame" x="168" y="323" width="39" height="21"/> <fontDescription key="fontDescription" type="system" pointSize="17"/> <color key="textColor" cocoaTouchSystemColor="darkTextColor"/> <nil key="highlightedColor"/> </label>


3. iOS 應用啟動步驟簡介


( 1 ) iOS 應用啟動步驟


iOS 應用啟動步驟 :

  • 1.程序入口 main 函數 : main () 函數 在 Xcode 中 代碼 路徑 下的 Supporting Files 目錄下 的 main.m 文件中 ;
  • 2.調用 UIApplicationMain 方法 : 調用 UIApplicationMain 方法 , 啟動應用 ;
UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  • 3.查找 Storyboard : 查找 在 應用設置中 的 Main Interface 設置的 Storyboard 文件 , 該文件是 應用啟動 加載 的 UI 界面 ;
  • 4.查找 啟動界面 : 查找 在 Storyboard 中 箭頭指向 的 啟動 ViewController ;
  • 5.加載 UI 界面 : 讀取 Storyboard 文件 , 加載并分析 其 XML 標簽 屬性 和 值 對應的 控件 , 創建這些控件 并 添加到 ViewController 中 ;
  • 6.調用 viewDidLoad 方法 : 界面 加載 完畢后 , 調用 ViewController.m 中的 viewDidLoad 方法 ;
  • 7.界面 展示 : 將創建的 UI 界面 在手機屏幕上 展示 給用戶 ;




五. Bundle 簡介



( 1 ) Bundle 簡介


Bundle 簡介 : 應用程序名稱.app 是 Bundle , 是一個 目錄 ;

  • 1.Mac 中的 Bundle : 在 Mac 中的 Finder 中 , 點擊 應用程序 目錄 , 其中是一個個 “.app” 后綴 的 文件 , 這些文件 就是 Bundle , 可以右鍵點擊 選擇 顯示包內容 , 查看其中的 目錄 內容 ;
  • 2.顯示包內容 : 右鍵點擊 app 后綴 文件 , 選擇 顯示包內容 選項 , 即可查看其內容 , 其 Contents 下的 內容 就是 Bundle ;

  • 3.iOS 中的 Bundle : 與 Mac 基本相同 , iOS 應用程序 , 打包好以后 , 也是一個 .app 后綴的 文件 , 也可以通過 右鍵 點擊 該文件 , 選擇 顯示包內容 查看 Bundle ;
  • 4.Bundle 路徑 : 在應用中 , 可以通過 NSLog(NSHomeDirectory()); 打印出 沙盒路徑 , 在 該路徑 向后 退 兩層 目錄 , 可以看到 Bundle 目錄 , Bundle 文件都在該 目錄中 ;
//打印出的路徑示例 /Users/hanshuliang/Library/Developer/CoreSimulator/Devices/C7ECF957-38E2-4E3F-ADC1-1FC5D26B4C79/data/Containers/Data/Application/7128774A-7468-466B-9C44-962CF974F8CB

Bundle 路徑 :

  • 5.iOS 中的 .app 文件路徑 : 在 Bundle 目錄下 , Application 路徑 下 的 二級 文件 就是 iOS 中的 app 后綴文件 , 右鍵 可查看其 內容 ;
  • 6.查看 Bundle 內容 : 右鍵點擊 “5.NSBundleDemo.app” 文件 , 選擇 顯示包內容 選項 , 可以查看 Bundle 內容 , 如下圖 ;
  • 7.創建文件 : 創建 1 個 新的 Storyboard 文件 , 然后 再次查看 Bundle , 即可看到 在 Bundle 中 出現了一個 新文件 ; 這個 文件 是 加密的 , 無法查看 ;



( 2 ) 圖片放置 位置 ( ① 放在 Assets.xcassets [推薦] | ② 放在根目錄[不推薦] )


圖片放置 位置 : 準備兩張圖片 , 分別放在 代碼 根目錄 和 Assets.xcassets 中 ;

  • 1.放在 根目錄 : 在 Bundle 中 也可以 看到 該圖片 , 不安全 ;
  • 2.放在 Assets.xcassets 目錄中 : 放在 該 目錄下 , 打包后 放在 Assets.car 中 , 放在根目錄的圖片 直接顯示在 Bundle 中 ;


( 3 ) NSBundle 使用 ( ① 獲取 NSBundle 對象 | ② 獲取 Bundle 目錄下 某文件的 全路徑 )


NSBundle 使用 :

  • 1.NSBundle 類 作用 : 獲取了 NSBundle 類 , 就相當于獲取了 Bundle 目錄中的內容 ; 如 下圖 的內容 ;
  • 2.獲取 NSBundle 對象 : 通過 調用 NSBundle 的 mainBundle 方法 , 獲取該對象 ;
// 2. 獲取當前應用程序的 BundleNSBundle *mainBundle = [NSBundle mainBundle];
  • 3.獲取 Bundle 下的 文件路徑 : 可以通過 pathForResource 方法 獲取 某文件的 路徑 , ① 傳入 文件名 和 后綴 兩個參數 , ② 或者 傳入 文件名.后綴 參數 ;
// 3. 獲取 Bundle 中 某文件 的 全路徑NSString *path = [mainBundle pathForResource:@"5_ Mondeo" ofType:@"jpeg"];NSLog(path);// 4. 獲取 Bundle 中 某文件 的 全路徑 , 使用另外一種方式NSString *path1 = [mainBundle pathForResource:@"5_ Mondeo.jpeg" ofType:nil];NSLog(path1);
  • 4.輸出結果 :
2019-02-12 22:46:33.797 5.NSBundleDemo[3253:29735] /Users/hanshuliang/Library/Developer/CoreSimulator/Devices/C7ECF957-38E2-4E3F-ADC1-1FC5D26B4C79/data/Containers/Bundle/Application/C004925F-E20C-4122-A6E0-89D2D6B0CA7B/5.NSBundleDemo.app/5_ Mondeo.jpeg 2019-02-12 22:46:33.797 5.NSBundleDemo[3253:29735] /Users/hanshuliang/Library/Developer/CoreSimulator/Devices/C7ECF957-38E2-4E3F-ADC1-1FC5D26B4C79/data/Containers/Bundle/Application/C004925F-E20C-4122-A6E0-89D2D6B0CA7B/5.NSBundleDemo.app/5_ Mondeo.jpeg



六. Property List 簡介



( 1 ) Property List 創建 ( ① New File | ② iOS -> Resource -> Property List | ③ 數據設置 | ④ 類型設置 )


PList 創建 :

  • 1.創建文件 : 右鍵 點擊 代碼目錄 , 選擇 New File 選項 ;
  • 2.設置文件類型 : 選擇 iOS -> Resource -> Property List 文件 ;
  • 3.設置文件路徑 : 設置 文件 名稱 , 并 選擇 文件路徑 ;
  • 4.添加數據 : 點擊 PList 中的 加號 按鈕 , 即可添加數據 ;
  • 5.數據類型設置 : 默認 的 根元素 是 Dictionary 字典 , 這里暫時只討論 字典 的 情況 ;


( 2 ) 獲取 Property List 數據 ( ① 獲取 Bundle PList 路徑 | ② dictionaryWithContentsOfFile 初始化字典 | ③ 查看數據 )


獲取 PList 數據 :

  • 1.查看 Bundle 中 PList 文件 : 之前 創建 了一個 PList 文件 , 這里進入 Bundle 目錄中 查看 , 根據之前 打印的 Bundle 路徑 , 查看 其 文件內容 :
  • 2.獲取 Bundle 目錄中 的 PList 文件 路徑 : 調用 NSBundle 對象的 pathForResource 方法 , 獲取 PList 在 Bundle 中的 全路徑 ;
// 5. 獲取 dictionary.plist 的 Bundle 路徑NSString *path2 = [mainBundle pathForResource:@"dictionary.plist" ofType:nil];NSLog(path2);
  • 3.根據文件路徑 初始化 字典 : 調用 NSDictionary 的 dictionaryWithContentsOfFile 方法 , 初始化字典 , 傳入的是 PList 路徑 ;
// 6. 根據 PList 路徑 初始化 字典 , 前提是 這個 PList 的類型是 字典類型的NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:path2];
  • 4.調試查看字典內容 : 在 字典 初始化 位置 打斷點 , 查看初始化的內容 ;



( 3 ) Property List 多種類型 數據 設置 獲取 ( ① 設置 Root 類型為 NSArray | ② 設置 多類型 數據 | ③ 獲取 PList 的 Bundle 路徑 | ④ 初始化 數組 | ⑤ 打斷點查看數據 )


PList 多種類型數據設置 : 上面 講解 了 根元素 為 字典 的情況 , 這里討論 根元素 為 數組 的情況 , 其中 數組的 每個元素 都可以設置 不同的類型 ;

  • 1.設置根元素類型為數組 :
  • 2.設置多個類型的數據 : 每個 數組 元素 可以設置 不同的 類型 , 這里設置 字典 , 數字 , 布爾 值 三個 數組元素 ;
  • 3.獲取 PList 的 Bundle 路徑 : 調用 NSBundle 對象的 pathForResource 方法 獲取 對應文件的 Bundle 全路徑 ;
// 7. 獲取 array.plist 的 Bundle 路徑NSString *path3 = [mainBundle pathForResource:@"array.plist" ofType:nil];NSLog(path3);
  • 4.初始化 數組 : 調用 NSArray 的 arrayWithContentsOfFile 方法 初始化 數組 , 傳入 PList 的路徑 , 注意 這個 PList 的 Root 類型 必須是 Array 類型 的 ;
// 8. 根據 PList 路徑 初始化 數組 , 前提是 這個 PList 的類型是 數組類型的NSArray *array = [NSArray arrayWithContentsOfFile:path3];
  • 5.打斷點查看 數組 內容 :




七. 優化 圖片 瀏覽器 ( ① 使用 PList | ② 懶加載 )



( 1 ) 使用 PList 存儲 數據 ( ① 創建 PList 文件 | ② 數據準備 | ③ 獲取 Bundle 路徑 | ④ 獲取 PList 的 Bundle 路徑 | ⑤ PList -> 數組 )


使用 PList 存儲數據 :

  • 1.創建 PList 文件 : 創建 名稱為 car.plist 的文件 , 將其 Root 類型設置為 Array 類型 ;
  • 2.數據準備 : 將 圖片名稱 和 描述 信息 存入 plist 文件中 ;
  • 3.獲取 Bundle 路徑 :
// 1. 獲取 BundleNSBundle *mainBundle = [NSBundle mainBundle];
  • 4.獲取 PList Bundle 路徑 :
// 2. 獲取 plist 文件路徑NSString *path = [mainBundle pathForResource:@"car.plist" ofType:nil];
  • 5.初始化數組 :
// 3. 初始化數組self.pics = [NSArray arrayWithContentsOfFile:path];

( 2 ) 懶加載 優化 ( ① 在 get 方法中加載數據 | ② 如果為 空 才 加載 )


懶加載優化 :

  • 1.懶加載原則 : ① 用到 某 屬性的時候才去 加載 ; ② 沒有值 時 才 進行初始化 ;
  • 2.點語法說明 : 以 @property (strong, nonatomic) NSArray * pics; 為例 , self.pics 相當于 get 方法 , 即調用了 -(NSArray *) pics;方法 ; set 方法調用的是 -(void)setPics:(NSArray*)pics; ; 其實際的 變量名稱 是 _pics ; 根據 用到 屬性時 才去加載 原則 , 這里將加載過程放在 get 方法中 ;
  • 3.讀取 plist 頻率 : 一般情況下 程序 運行起來 , plist 是不會改變的 , 因此 只需要加載一次即可 ; 根據 沒有值 的時候才去 初始化 原則 , 只有當屬性為 空時 , 才執行初始化操作 ;
  • 4.代碼 :
//懶加載優化 , 原則 1 : 只有使用 pics 屬性時 開始優化 , 因此 代碼 放在 get 方法中 - (NSArray *)pics {// 懶加載優化 , 原則 2 : 只有 pics 屬性為 空時 才開始從 list 中 初始化 數據if(_pics == nil){// 1. 獲取 BundleNSBundle *mainBundle = [NSBundle mainBundle];// 2. 獲取 plist 文件路徑NSString *path = [mainBundle pathForResource:@"car.plist" ofType:nil];// 3. 初始化數組 , 注意 此處要使用 生成的 變量名_pics = [NSArray arrayWithContentsOfFile:path];}return _pics; }



八. UIImageView 播放動畫 及 內存優化



1. 動畫 播放



( 1 ) UIImageView 動畫 相關屬性 ( ① 圖片數組 | ② 動畫時長 | ③ 重復次數 )


UIImageView 動畫相關屬性 :

  • 1.動畫圖片數組 : 多個 NSArray 數組 , 其中元素類型是 UIImage ;
@property (nullable, nonatomic, copy) NSArray<UIImage *> *animationImages; // The array must contain UIImages. Setting hides the single image. default is nil
  • 2.動畫持續時間 : 單位 秒 ;
@property (nonatomic) NSTimeInterval animationDuration; // for one cycle of images. default is number of images * 1/30th of a second (i.e. 30 fps)
  • 3.動畫重復次數 : 無限循環 設置 0 ;
@property (nonatomic) NSInteger animationRepeatCount; // 0 means infinite (default is 0)

( 2 ) UIImageView 動畫 相關方法 ( ① 開始播放 | ② 停止播放 | ③ 是否正在播放 )


UIImageView 動畫相關方法 :

  • 1.開始播放 :
- (void)startAnimating;
  • 2.停止播放 :
- (void)stopAnimating;
  • 3.是否正在播放 :
- (BOOL)isAnimating;

( 3 ) UIImageView 動畫 執行流程 ( ① 準備 UIImage 數組 | ② 設置動畫參數 UIImage數組 時長 重復次數 | ③ 啟動動畫 )


UIImageView 動畫 執行流程 :

  • 1.首先判斷 動畫 是否在執行 : 動畫執行 操作 會覆蓋 上一次的 動畫 , 每次 調用 startAnimating 都會 重新開始 執行動畫 , 因此 當動畫正在 執行時 , 不要覆蓋 ; 使用 isAnimating 方法 先判斷 動畫是否在習性 ;
// 1. 先判斷 動畫是否在執行 , 如果動畫在執行 , 直接退出方法if([self.imageView isAnimating]) return;
  • 2.準備數據 : 準備 UIImage 數組 ;
// 2. 數據準備 , 準備 UIImage 數組NSArray *nameArray = @[@"1_Mustang", @"2_Prado", @"3_Camaro", @"4_LandCru", @"5_Mondeo"];NSMutableArray *imageArray = [NSMutableArray array];for(int i = 0; i < nameArray.count; i ++){//獲取 UIImage 對象 , 并放入數組[imageArray addObject:[UIImage imageNamed:nameArray[i]] ];}
  • 3.設置圖片 : 將準備好的 UiImage 數組 設置 到 animationImages 屬性中 ;
// 3. 設置圖片self.imageView.animationImages = imageArray;
  • 4.設置動畫參數 : 設置動畫的 時長 ( animationDuration 屬性 ) 和 重復次數 ( animationRepeatCount 屬性 ) ;
// 4. 設置動畫參數 : 時長 , 循環次數self.imageView.animationDuration = 1;self.imageView.animationRepeatCount = 1;
  • 5.開始執行動畫 : 執行 startAnimating 方法 , 開始執行動畫 ;
// 5. 開始執行動畫[self.imageView startAnimating];
  • 6.完整代碼 :
//播放動畫的 方法 - (IBAction)startAnimation:(UIButton *)sender {// 1. 先判斷 動畫是否在執行 , 如果動畫在執行 , 直接退出方法if([self.imageView isAnimating]) return;// 2. 數據準備 , 準備 UIImage 數組NSArray *nameArray = @[@"1_Mustang", @"2_Prado", @"3_Camaro", @"4_LandCru", @"5_Mondeo"];NSMutableArray *imageArray = [NSMutableArray array];for(int i = 0; i < nameArray.count; i ++){//獲取 UIImage 對象 , 并放入數組[imageArray addObject:[UIImage imageNamed:nameArray[i]] ];}// 3. 設置圖片self.imageView.animationImages = imageArray;// 4. 設置動畫參數 : 時長 , 循環次數self.imageView.animationDuration = 1;self.imageView.animationRepeatCount = 1;// 5. 開始執行動畫[self.imageView startAnimating];}


2. 圖片內存 優化



( 1 ) UIImageView 動畫 內存 查看 ( ① Debug Navigator 查看內存 | ② 查看 動畫播放前后的內存變化 | ③ 分析內存不釋放的原因 )


UIImageView 內存查看 :

  • 1.查看內存方式 : 內存 可以在 Debug Navigator 中 進行查看 , 前提是 應用 必須處于正在運行的狀態 ;

  • 2.運行并查看內存 : 播放之前 內存 是 19.9M ;
  • 3.點擊播放動畫查看內存 : 點擊播放按鈕 , 及 播放 完畢之后 , 內存一直保持在 36.9M ;
  • 4.分析原因 : 這是 由于 圖片 一直 駐留在內存中 沒有釋放 , 使用 UIImage imageNamed 方法 加載的圖片 , 不會釋放 ;


( 2 ) UIImage 內存分析 ( ① 使用 UIImage imageNamed:圖片名稱 加載圖片 | ② 使用 UIImage imageWithContentsOfFile:Bundle路徑名 加載圖片 )


UIImage 內存分析 :

  • 1.使用 UIImage imageNamed:圖片名稱 加載圖片 : 使用該方式 加載 圖片 , 圖片會在 內存中 駐留 , 只有需要長期保持的 圖片 , 如 UI 界面的 經常顯示 的 各種背景 圖標 等 , 使用該方式加載 ;
UIImage *image = [UIImage imageNamed:@"1.png"];
  • 2.使用 UIImage imageWithContentsOfFile:Bundle路徑名 加載圖片 : 使用該方式加載圖片時 , 如果圖片沒有被引用時 , 圖片占用的內存就會被釋放 ; 即 將圖片持有變量設置為 nil 即可 ;
//2.1獲取 BundleNSBundle *mainBundle = [NSBundle mainBundle];//2.2獲取 圖片對應的 Bundle 路徑NSString *path = [mainBundle pathForResource:nameArray[i] ofType:@"jpeg"];//2.3根據 Bundle 路徑 獲取 UIImageUIImage *image = [UIImage imageWithContentsOfFile:path];

( 3 ) 內存優化 的 動畫 執行 完整流程 ( ① 準備 UIImage 數組 | ② 設置動畫參數 UIImage數組 時長 重復次數 | ③ 啟動動畫 | ④ 異步設置圖片數組為 nil )


內存優化后的 動畫 執行流程 :

  • 1.首先判斷 動畫 是否在執行 : 動畫執行 操作 會覆蓋 上一次的 動畫 , 每次 調用 startAnimating 都會 重新開始 執行動畫 , 因此 當動畫正在 執行時 , 不要覆蓋 ; 使用 isAnimating 方法 先判斷 動畫是否在習性 ;
// 1. 先判斷 動畫是否在執行 , 如果動畫在執行 , 直接退出方法if([self.imageView isAnimating]) return;
  • 2.準備數據 : 準備 UIImage 數組 ; 這里需要從 Bundle 中獲取圖片 , 因此需要將圖片 放置在 Xcode 中的 Assets.xcassets 之外 ( Bundle 中無法獲取其中的資源路徑 ) , 拖入一個圖片文件夾 , 這里要注意 在 “Choose options for adding these files” 對話框中 選擇 Create groups 選項 , 否則 就無法獲取到 Bundle 中的 文件路徑 ;
// 2. 數據準備 , 準備 UIImage 數組NSArray *nameArray = @[@"1_Mustang", @"2_Prado", @"3_Camaro", @"4_LandCru", @"5_Mondeo"];NSMutableArray *imageArray = [NSMutableArray array];for(int i = 0; i < nameArray.count; i ++){//2.1獲取 BundleNSBundle *mainBundle = [NSBundle mainBundle];//2.2獲取 圖片對應的 Bundle 路徑NSString *path = [mainBundle pathForResource:nameArray[i] ofType:@"jpeg"];//2.3根據 Bundle 路徑 獲取 UIImageUIImage *image = [UIImage imageWithContentsOfFile:path];//2.4獲取 UIImage 對象 , 并放入數組[imageArray addObject:image ];}
  • 3.設置圖片 : 將準備好的 UiImage 數組 設置 到 animationImages 屬性中 ;
// 3. 設置圖片self.imageView.animationImages = imageArray;
  • 4.設置動畫參數 : 設置動畫的 時長 ( animationDuration 屬性 ) 和 重復次數 ( animationRepeatCount 屬性 ) ;
// 4. 設置動畫參數 : 時長 , 循環次數self.imageView.animationDuration = 1;self.imageView.animationRepeatCount = 1;
  • 5.開始執行動畫 : 執行 startAnimating 方法 , 開始執行動畫 ;
// 5. 開始執行動畫[self.imageView startAnimating];
  • 6.清除動畫圖片方法 : 直接將 UIImageView 的 animationImages 動畫圖片數組 設置為 nil 即可 ;
//清除 UIImageView 的 動畫圖片 - (void) clearImage {self.imageView.animationImages = nil; }
  • 7.異步執行方法 : 需要 在動畫開始 1 秒之后執行 , 代碼實現如下 :
// 6. 1秒后清除 動畫圖片[self performSelector:@selector(clearImage) withObject:nil afterDelay:1];
  • 8.完整代碼 :
//播放動畫 并釋放內存 - (IBAction)startAnimationReleaseMemory:(UIButton *)sender {// 1. 先判斷 動畫是否在執行 , 如果動畫在執行 , 直接退出方法if([self.imageView isAnimating]) return;// 2. 數據準備 , 準備 UIImage 數組NSArray *nameArray = @[@"1_Mustang", @"2_Prado", @"3_Camaro", @"4_LandCru", @"5_Mondeo"];NSMutableArray *imageArray = [NSMutableArray array];for(int i = 0; i < nameArray.count; i ++){//2.1獲取 BundleNSBundle *mainBundle = [NSBundle mainBundle];//2.2獲取 圖片對應的 Bundle 路徑NSString *path = [mainBundle pathForResource:nameArray[i] ofType:@"jpeg"];//2.3根據 Bundle 路徑 獲取 UIImageUIImage *image = [UIImage imageWithContentsOfFile:path];//2.4獲取 UIImage 對象 , 并放入數組[imageArray addObject:image ];}// 3. 設置圖片self.imageView.animationImages = imageArray;// 4. 設置動畫參數 : 時長 , 循環次數self.imageView.animationDuration = 1;self.imageView.animationRepeatCount = 1;// 5. 開始執行動畫[self.imageView startAnimating];// 6. 1秒后清除 動畫圖片[self performSelector:@selector(clearImage) withObject:nil afterDelay:1];}//清除 UIImageView 的 動畫圖片 - (void) clearImage {self.imageView.animationImages = nil; }

( 4 ) NSBundle pathForResource 為 nil 解決方案 ( ① 拖入目錄 選擇 Create gropus | ② 查看 Xcode 項目 配置 -> Build phases 的 Bundle 配置 )


NSBundle pathForResource 為 nil 解決方案 :

  • 1.拖入目錄方法 :將 pic 目錄 拖入 Xcode 中時 , 需要選擇 Create groups 選項 , 不能選擇 Create folder reference 選項 ;
  • 2.確認是否可以獲取到 : 在 Xcode 項目設置中 , 如果有 要獲取的 具體的 圖片 文件設置 , 那么可以獲取到 , 如果只有 圖片的 目錄 pic , 沒有具體的 圖片 配置 , 那么圖片就獲取不到 ;


( 5 ) 效果展示


效果展示 :


博客相關資源 :

  • 1.CSDN下載地址 : https://download.csdn.net/download/han1202012/10956883

總結

以上是生活随笔為你收集整理的【 iOS 应用开发 】 UIKit 控件 ( 代码生成控件 | UIView 属性方法 | Storyboard | Bundle | Property List | 动画 | 图片内存优化 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。