兩種通過Plist加載圖片的方法及問題唱凯,九宮格的算法谎痢,字典轉(zhuǎn)模型

1. 序列幀動(dòng)畫實(shí)現(xiàn)

  1. 1方式1:

[UIImage animatedImageWithImages:**動(dòng)畫圖片數(shù)組** duration:**持續(xù)時(shí)間**]; // 可以獲取一個(gè)能做動(dòng)畫的UIImage對(duì)象"gif圖片"

  1. 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方式1节猿,通過文件路徑加載(本地)

NSString *path = [[NSBundle mainBundle] pathForResource:@"images.plist" ofType:nil];

NSArray *images = [NSArray arrayWithContentsOfFile:path];

  1. 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.1 通過imageNamed方法
  • 系統(tǒng)會(huì)進(jìn)行緩存,程序員無法銷毀.

  • 加載圖片時(shí)圖片最好就直接放在Assets文件中


self.imageView.image = [UIImage imageNamed:@"image文件名"];


  1. 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è)事件

  1. 把加載xib的實(shí)現(xiàn)細(xì)節(jié)封裝在此類中

  2. 把子控件設(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里面用來接收模型類型的屬性
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市给郊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌统锤,老刑警劉巖炭庙,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異逾雄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鸦泳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門做鹰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人更振,你說我怎么就攤上這事喂走。” “怎么了芋肠?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵帖池,是天一觀的道長散吵。 經(jīng)常有香客問我,道長庶艾,這世上最難降的妖魔是什么况脆? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任彤叉,我火速辦了婚禮,結(jié)果婚禮上秽浇,老公的妹妹穿的比我還像新娘。我一直安慰自己审残,他們只是感情好斑举,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著璧坟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沸柔。 梳的紋絲不亂的頭發(fā)上铲敛,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天伐蒋,我揣著相機(jī)與錄音,去河邊找鬼先鱼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛掸读,可吹牛的內(nèi)容都是我干的宏多。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肾请,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼更胖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起却妨,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤管呵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后捐下,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奸柬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年廓奕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桌粉。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铃肯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出押逼,到底是詐尸還是另有隱情,我是刑警寧澤咙冗,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布漂彤,位于F島的核電站,受9級(jí)特大地震影響仪或,放射性物質(zhì)發(fā)生泄漏范删。R本人自食惡果不足惜拷肌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望添忘。 院中可真熱鬧,春花似錦搁骑、人聲如沸又固。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洋只。三九已至昼捍,卻和暖如春肢扯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔚晨。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人育拨。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓熬丧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親析蝴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容