1. 序列幀動(dòng)畫實(shí)現(xiàn)
- 1方式1:
[UIImage animatedImageWithImages:**動(dòng)畫圖片數(shù)組** duration:**持續(xù)時(shí)間**]; // 可以獲取一個(gè)能做動(dòng)畫的UIImage對(duì)象"gif圖片"
- 2 方式2:
self.imageView.animationImages = array; // 裝圖片的數(shù)組(需要做動(dòng)畫的圖片數(shù)組)
self.imageView.animationDuration = 2; // 動(dòng)畫時(shí)間
self.imageView.animationRepeatCount = 1; // 重復(fù)次數(shù) 0 表示重復(fù)
[self.imageView startAnimating]; // 開始序列幀動(dòng)畫
2. 圖片瀏覽器-兩種加載plist的方式
- 1方式1节猿,通過文件路徑加載(本地)
NSString *path = [[NSBundle mainBundle] pathForResource:@"images.plist" ofType:nil];
NSArray *images = [NSArray arrayWithContentsOfFile:path];
- 2方法2票从,通過文件 URL 加載(本地/網(wǎng)絡(luò))統(tǒng)一資源定位符
- NSURL *url = [[NSBundle mainBundle] URLForResource:@"images.plist" withExtension:nil];
- NSArray *images = [NSArray arrayWithContentsOfURL:url];
3. 圖片瀏覽器-內(nèi)存問題
3.1 加載圖片的兩種方法
- 1.1 通過imageNamed方法
系統(tǒng)會(huì)進(jìn)行緩存,程序員無法銷毀.
加載圖片時(shí)圖片最好就直接放在Assets文件中
self.imageView.image = [UIImage imageNamed:@"image文件名"];
- 1.2通過imageWithContentsOfFile方法
建立的圖片,使用完成之后,會(huì)自動(dòng)被釋放.
用路徑方式去加載圖片時(shí)圖片不能放在Assets中,因?yàn)榉旁贏ssets文件中的圖片編譯后會(huì)被打包成.car文件
[UIImage imageWithContentsOfFile:<#(nonnull NSString *)#>];
3.2 如何選擇加載圖片方式:
常用的圖片滨嘱,(小的按鈕/背景)素材,放在 Assets 中吟榴,使用 imageNamed 加載躺彬,性能高
臨時(shí)使用的圖片,放在項(xiàng)目的Supporting Files文件夾下仿野,獲取圖片文件后,使用 imageWithContentsOfFile 加載她君,使用完成立即釋放!
4 MVC簡單介紹和類前綴
模型 : 數(shù)據(jù)
視圖 : 負(fù)責(zé)顯示
控制器 : 處理邏輯,如跳轉(zhuǎn)界面
類前綴蘋果推薦使用三個(gè)或三個(gè)以上字母,防止重名
5 應(yīng)用管理-兩種加載xib的方式
從 NSBundle加載XIB,只需要在第一個(gè)參數(shù)傳入 XIB 的文件名球涛,注意:沒有擴(kuò)展名
- 方法1校镐,iOS 3.0 的方法
UIView *appView = [[NSBundle mainBundle] loadNibNamed:@"CZAppView" owner:nil options:nil].lastObject;
- 方法2,iOS 4.0 的方法鸟廓,做了內(nèi)存優(yōu)化"如果內(nèi)存緊張"內(nèi)存警告,可以自動(dòng)釋放,如果有需要會(huì)重新自動(dòng)加載""
//第一個(gè)參數(shù):XIB的名字
//第二個(gè)參數(shù):Bundle 名引谜,如果傳入 nil,會(huì)自動(dòng)從 mainBundle 獲取
UINib *nib = [UINib nibWithNibName:@"CZAppView" bundle:nil];
//第一個(gè)员咽、第二個(gè)參數(shù),老師沒有講契讲,說自己從來沒有用過。就寫nil怀泊。
UIView *appView = [nib instantiateWithOwner:nil options:nil].lastObject;
6-應(yīng)用管理-管理XIB的類
管理xib的類一般做兩個(gè)事件
把加載xib的實(shí)現(xiàn)細(xì)節(jié)封裝在此類中
把子控件設(shè)置數(shù)據(jù)的代碼也封裝在此類的內(nèi)部,不要放在外面
#import <UIKit/UIKit.h>
@class HMApp;
@interface HMAppView : UIView
// 定義一個(gè)屬性用來接收數(shù)據(jù)
@property (nonatomic, strong) HMApp *app;
// 創(chuàng)建appView
+ (instancetype)appView;
@end
在自定義View中,新建類方法返回自己的實(shí)例,然后加載xib.
MVC中V負(fù)責(zé)顯示,C只需要拿到這個(gè)視圖,至于這個(gè)視圖是怎么來的,C不需要關(guān)心.
7 應(yīng)用管理-九宮格布局
// 定義格子的寬和高
NSInteger appW = 100;
NSInteger appH = 120;
// 定義格子的總數(shù)量
NSInteger countOfApps = 80;
// 定義一行有幾個(gè)格子
NSInteger numberOfCol = 3;
// 定義左邊距霹琼、右邊距、頂部間距
NSInteger marginOfLeft = 10;
NSInteger marginOfRight = 10;
NSInteger marginOfTop = 30;
// 格子之間的間距 視圖總寬度-左邊距-右邊距-(格子寬*一行有幾個(gè)) / (一行有幾個(gè) 減 1)
NSInteger marginOfApp = (self.view.bounds.size.width - marginOfLeft - marginOfRight - (appW * numberOfCol)) / (numberOfCol - 1);
// 開始循環(huán)布局
for (NSInteger i = 0; i < countOfApps; i++) {
//計(jì)算列號(hào) 第幾個(gè)格子的索引 % 每行的個(gè)數(shù)
NSUInteger col = i % numberOfCol;
// 計(jì)算X = 左邊間距 + (格子的寬 + 格子之間的間距) * 列號(hào)
CGFloat appX = marginOfLeft + (appW + marginOfApp)*col;
//計(jì)算行號(hào) 行號(hào) = i / 列數(shù)
NSUInteger row = i / numberOfCol;
// 計(jì)算格子的Y = 頂部間距 + (格子的高 + 格子之間間距) * 行號(hào)
CGFloat appY = marginOfTop + (appH + marginOfApp)*row;
// 建立UIView
GMAppView *xib = [GMAppView GMAppView];
xib.appInfo = _appData[i];
//設(shè)置frame
xib.frame = CGRectMake(appX, appY, appW, appH);
//把a(bǔ)ppView添加到控制器的view上
[self.view addSubview:xib];
}
8 字典轉(zhuǎn)模型+MVC
8.1 字典轉(zhuǎn)模型的原因
直接通過字典的鍵名獲取plist中的數(shù)據(jù)信息,需要直接和數(shù)據(jù)打交道忠藤,如果需要多次使用可能會(huì)因?yàn)椴恍⌒陌焰I名寫錯(cuò),而程序并不報(bào)錯(cuò)尖阔。鑒于此榨咐,可以考慮把字典數(shù)據(jù)轉(zhuǎn)換成一個(gè)模型,把數(shù)據(jù)封裝到一個(gè)模型中去块茁,讓viewController不再直接和數(shù)據(jù)打交道数焊,而是和模型交互。
一般情況下佩耳,設(shè)置數(shù)據(jù)和取出數(shù)據(jù)都使用“字符串類型的key”,編寫這些key時(shí)答恶,編輯器沒有智能提示萍诱,需要手敲污呼。如:
dict[@"name"] = @"Jack";NSString *name = dict[@"name"];```
##8.2 字典轉(zhuǎn)模型的流程
![](http://upload-images.jianshu.io/upload_images/2248583-c479385a9d8363d9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
##8.3 注意點(diǎn)
模型應(yīng)該提供一個(gè)可以傳入字典參數(shù)的構(gòu)造方法
**同時(shí)籍凝,還要提供讀取Plist,并轉(zhuǎn)為數(shù)組的方法**
-(instancetype)initWithDict:(NSDictionary *)dict;
+(instancetype)xxxWithDict:(NSDictionary *)dict;
- (NSArray *)loadPlist;
//方法實(shí)現(xiàn)
-
(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中的數(shù)組中存放的是一個(gè)一個(gè)字典退盯,因此遍歷數(shù)組中的字典。把遍歷出來的字典添加入可變數(shù)組慰照。
for (NSDictionary * dict in array) {
GMModel * temp = [GMModel modelWithDict:dict];
[arrayM addObject:temp];
}
return arrayM;
}
提示:在模型中合理地使用只讀屬性琉朽,可以進(jìn)一步降低代碼的耦合度。
聲明屬性
@property (nonatomic, copy) NSString *name;@property (nonatomic, copy) NSString *icon;
// 圖像,定義屬性時(shí)墅垮,會(huì)生成getter&setter方法耕漱,還會(huì)生成一個(gè)帶下劃線的成員變量// 如果是readonly屬性,只會(huì)生成getter方法孤个,同時(shí)沒有成員變量@property (nonatomic, strong, readonly) UIImage *image;
### 8.3.1 作為模型
- 有和字典一樣的屬性
- 有一個(gè)根據(jù)字典返回自己的方法 (類方法、對(duì)象方法兩種)
- 加載plist并轉(zhuǎn)為數(shù)組的方法
### 8.3.2 作為view
- 有一個(gè)返回自己的實(shí)例的方法(至于怎么創(chuàng)建的 無所謂)
- 在.h 里面有一個(gè)用來接收模型類型的屬性
- 在.m 里面應(yīng)該有需要顯示值的子控件
- 重寫set模型的方法,先模擬系統(tǒng)的_xx=xx,把數(shù)據(jù)放在子控件當(dāng)中
### 8.3.3 作為controller
- 解析數(shù)據(jù),注意轉(zhuǎn)化成模型.步驟(路徑,解析臨時(shí)數(shù)組,創(chuàng)建可變數(shù)組,遍歷獲取字典,字典轉(zhuǎn)模型,把模型添加到可變數(shù)組中,返回).
- 根據(jù)view提供的方法添加到視圖上(c不關(guān)心view具體是如何創(chuàng)建的),并且,把解析的模型數(shù)據(jù)復(fù)制給view.h里面用來接收模型類型的屬性