1. 序列幀動畫實現
- 1方式1:
[UIImage animatedImageWithImages:**動畫圖片數組** duration:**持續時間**]; // 可以獲取一個能做動畫的UIImage對象"gif圖片"
- 2 方式2:
self.imageView.animationImages = array; // 裝圖片的數組(需要做動畫的圖片數組)
self.imageView.animationDuration = 2; // 動畫時間
self.imageView.animationRepeatCount = 1; // 重復次數 0 表示重復
[self.imageView startAnimating]; // 開始序列幀動畫
2. 圖片瀏覽器-兩種加載plist的方式
- 1方式1,通過文件路徑加載(本地)
NSString *path = [[NSBundle mainBundle] pathForResource:@"images.plist" ofType:nil];
NSArray *images = [NSArray arrayWithContentsOfFile:path];
- 2方法2,通過文件 URL 加載(本地/網絡)統一資源定位符
- NSURL *url = [[NSBundle mainBundle] URLForResource:@"images.plist" withExtension:nil];
- NSArray *images = [NSArray arrayWithContentsOfURL:url];
3. 圖片瀏覽器-內存問題
3.1 加載圖片的兩種方法
- 1.1 通過imageNamed方法
系統會進行緩存,程序員無法銷毀.
加載圖片時圖片最好就直接放在Assets文件中
self.imageView.image = [UIImage imageNamed:@"image文件名"];
- 1.2通過imageWithContentsOfFile方法
建立的圖片,使用完成之后,會自動被釋放.
用路徑方式去加載圖片時圖片不能放在Assets中,因為放在Assets文件中的圖片編譯后會被打包成.car文件
[UIImage imageWithContentsOfFile:<#(nonnull NSString *)#>];
3.2 如何選擇加載圖片方式:
常用的圖片,(小的按鈕/背景)素材,放在 Assets 中,使用 imageNamed 加載,性能高
臨時使用的圖片,放在項目的Supporting Files文件夾下,獲取圖片文件后,使用 imageWithContentsOfFile 加載,使用完成立即釋放!
4 MVC簡單介紹和類前綴
模型 : 數據
視圖 : 負責顯示
控制器 : 處理邏輯,如跳轉界面
類前綴蘋果推薦使用三個或三個以上字母,防止重名
5 應用管理-兩種加載xib的方式
從 NSBundle加載XIB,只需要在第一個參數傳入 XIB 的文件名,注意:沒有擴展名
- 方法1,iOS 3.0 的方法
UIView *appView = [[NSBundle mainBundle] loadNibNamed:@"CZAppView" owner:nil options:nil].lastObject;
- 方法2,iOS 4.0 的方法,做了內存優化"如果內存緊張"內存警告,可以自動釋放,如果有需要會重新自動加載""
//第一個參數:XIB的名字
//第二個參數:Bundle 名,如果傳入 nil,會自動從 mainBundle 獲取
UINib *nib = [UINib nibWithNibName:@"CZAppView" bundle:nil];
//第一個、第二個參數,老師沒有講,說自己從來沒有用過。就寫nil。
UIView *appView = [nib instantiateWithOwner:nil options:nil].lastObject;
6-應用管理-管理XIB的類
管理xib的類一般做兩個事件
把加載xib的實現細節封裝在此類中
把子控件設置數據的代碼也封裝在此類的內部,不要放在外面
#import <UIKit/UIKit.h>
@class HMApp;
@interface HMAppView : UIView
// 定義一個屬性用來接收數據
@property (nonatomic, strong) HMApp *app;
// 創建appView
+ (instancetype)appView;
@end
在自定義View中,新建類方法返回自己的實例,然后加載xib.
MVC中V負責顯示,C只需要拿到這個視圖,至于這個視圖是怎么來的,C不需要關心.
7 應用管理-九宮格布局
// 定義格子的寬和高
NSInteger appW = 100;
NSInteger appH = 120;
// 定義格子的總數量
NSInteger countOfApps = 80;
// 定義一行有幾個格子
NSInteger numberOfCol = 3;
// 定義左邊距、右邊距、頂部間距
NSInteger marginOfLeft = 10;
NSInteger marginOfRight = 10;
NSInteger marginOfTop = 30;
// 格子之間的間距 視圖總寬度-左邊距-右邊距-(格子寬*一行有幾個) / (一行有幾個 減 1)
NSInteger marginOfApp = (self.view.bounds.size.width - marginOfLeft - marginOfRight - (appW * numberOfCol)) / (numberOfCol - 1);
// 開始循環布局
for (NSInteger i = 0; i < countOfApps; i++) {
//計算列號 第幾個格子的索引 % 每行的個數
NSUInteger col = i % numberOfCol;
// 計算X = 左邊間距 + (格子的寬 + 格子之間的間距) * 列號
CGFloat appX = marginOfLeft + (appW + marginOfApp)*col;
//計算行號 行號 = i / 列數
NSUInteger row = i / numberOfCol;
// 計算格子的Y = 頂部間距 + (格子的高 + 格子之間間距) * 行號
CGFloat appY = marginOfTop + (appH + marginOfApp)*row;
// 建立UIView
GMAppView *xib = [GMAppView GMAppView];
xib.appInfo = _appData[i];
//設置frame
xib.frame = CGRectMake(appX, appY, appW, appH);
//把appView添加到控制器的view上
[self.view addSubview:xib];
}
8 字典轉模型+MVC
8.1 字典轉模型的原因
直接通過字典的鍵名獲取plist中的數據信息,需要直接和數據打交道,如果需要多次使用可能會因為不小心把鍵名寫錯,而程序并不報錯。鑒于此,可以考慮把字典數據轉換成一個模型,把數據封裝到一個模型中去,讓viewController不再直接和數據打交道,而是和模型交互。
一般情況下,設置數據和取出數據都使用“字符串類型的key”,編寫這些key時,編輯器沒有智能提示,需要手敲。如:
dict[@"name"] = @"Jack";NSString *name = dict[@"name"];```
##8.2 字典轉模型的流程

##8.3 注意點
模型應該提供一個可以傳入字典參數的構造方法
**同時,還要提供讀取Plist,并轉為數組的方法**
-(instancetype)initWithDict:(NSDictionary *)dict;
+(instancetype)xxxWithDict:(NSDictionary *)dict;
- (NSArray *)loadPlist;
//方法實現
-
(instancetype)initWithDict:(NSDictionary *)dictionary{
if (self = [super init]) {
GMModel *appData = [GMModel new]; [appData setValuesForKeysWithDictionary:dictionary]; return appData;
}
return self;
}
- (instancetype)GModelWithDict:(NSDictionary *)dictionary{
return [[self alloc]initWithDict:dictionary];
}
/**
return a array from Plist
@return NSArray
*/
- (NSArray *)loadPlist{
// 獲取plist文件的NSURL
NSURL * plistUrl = [[NSBundle mainBundle] URLForResource:@"apps.plist" withExtension:nil];
// 通過Plist 的URL讀出文件中的array。
NSArray * array = [NSArray arrayWithContentsOfURL:plistUrl];
NSMutableArray * arrayM = [NSMutableArray array];
// plist中的數組中存放的是一個一個字典,因此遍歷數組中的字典。把遍歷出來的字典添加入可變數組。
for (NSDictionary * dict in array) {
GMModel * temp = [GMModel modelWithDict:dict];
[arrayM addObject:temp];
}
return arrayM;
}
提示:在模型中合理地使用只讀屬性,可以進一步降低代碼的耦合度。
聲明屬性
@property (nonatomic, copy) NSString *name;@property (nonatomic, copy) NSString *icon;
// 圖像,定義屬性時,會生成getter&setter方法,還會生成一個帶下劃線的成員變量// 如果是readonly屬性,只會生成getter方法,同時沒有成員變量@property (nonatomic, strong, readonly) UIImage *image;
### 8.3.1 作為模型
- 有和字典一樣的屬性
- 有一個根據字典返回自己的方法 (類方法、對象方法兩種)
- 加載plist并轉為數組的方法
### 8.3.2 作為view
- 有一個返回自己的實例的方法(至于怎么創建的 無所謂)
- 在.h 里面有一個用來接收模型類型的屬性
- 在.m 里面應該有需要顯示值的子控件
- 重寫set模型的方法,先模擬系統的_xx=xx,把數據放在子控件當中
### 8.3.3 作為controller
- 解析數據,注意轉化成模型.步驟(路徑,解析臨時數組,創建可變數組,遍歷獲取字典,字典轉模型,把模型添加到可變數組中,返回).
- 根據view提供的方法添加到視圖上(c不關心view具體是如何創建的),并且,把解析的模型數據復制給view.h里面用來接收模型類型的屬性