本文翻譯自 http://www.modejong.com/iOS/#ex7
Mo DeJong在他的部落格中提供了7個有趣的樣本SDK程式(適用於Xcode 3.2.5 和 iOS 4.2),“這些程式和提示資訊是專門為開發人員所寫,但原始碼用“as-is”方式開放給公眾”。我會對這七個SDK進行測試,作者在偷懶,但是我會給出程式碼片段和,必要的話給出我修改後的代碼。我的開發環境是Xcode 4.5 + iOS 5.1 ,希望能讓這些“老代碼”煥發生機。
目錄:
(1)多層級的UITableView
(2)PNG動畫
(3)使用ExtendedAudioFile API讀寫CAF格式
(4)使用CoreAudio進行PCM混音
(5)AutoPropertyRelease Class(自動釋放記憶體類)
(6)完善CoreAudio的淡出效果
(7)7zip(LZMA)SDK
本篇日誌將會提及其中的(1)(2),其餘SDK將會在之後的日誌中進行解說。
範例1:多層級的UITableView
“你是否也認為在使用UITableView的時候有那麼一點點困難呢?我發現有一種便捷的方法來建立多層級的TableView……但這僅限於只有文字的情況,你可以看看TextTableData 類是如何自訂一個TableView的” —— 這是作者遇到的情況及解決方案。
源碼:TextTableExample.zip(30kb)
需要注意的是直接編譯運行會報錯,問題出在Xcode 4.5 已經不支援用數值給NSString類賦值了。(其他的cocoa類應該也是如此),所以我們需要做一個轉換:
舊版代碼
for (TextTableElement* ttElement in inElements) {label = ttElement.label;label += 0x1; // Avoid compiler warning}
新版代碼
for (TextTableElement* ttElement in inElements) {label = ttElement.label; int intLabel = [label intValue];intLabel += 0x1; // Avoid compiler warning label = [NSString stringWithFormat:@"%d",intLabel];}
這樣就可以順利使NSString的值自增。
代碼可以順利運行。但是按目前的“流行標準”來看,似乎這樣的設計基本是用不到了。在此推薦另一種“多層級”的TableView —— 可摺疊的TableView:
http://blog.csdn.net/kmyhy/article/details/5979560
另外也可以看看code4app中一個很好的TableView樣本:
http://code4app.com/ios/TableView%E7%9A%84%E5%90%84%E7%A7%8D%E6%93%8D%E4%BD%9C/50bf05986803fa8e5c000001
這個例子是許多App都在使用的一種模式,非常適合用來組織含大量資料的TableView。
範例2:PNG動畫
iPhone/iOS 不支援播放gif格式的動畫,於是連續播放動畫就需要一些“曲線救國”的方法,我想一般人都會選擇比較熟悉的CoreAnimation進行圖片的連續播放來達到目的。似乎這位Mo DeJong同學對影音處理特別感興趣,他用的是 MediaPlayer.framework 中的 MPMoviePlayerController 。“當你用到MPMoviePlayerController的時候你應該也像我一樣想抓頭髮……” 作者認為官方API提供的功能“大部分都需要自己進行完善”才能播放音、視頻,而且不能完成他“連續播放一些PNG圖片”的需求。MPMoviePlayerController不能搞定,CoreAnimation又會佔盡記憶體
—— 怎麼辦?看作者的例子吧。在15FPS下播放30幀480x320的PNG映像,後面說了一堆關於CPU效能和音頻支援方面的我不太懂就不瞎翻譯了。
源碼:PNGAnimatorDemo.zip(165kb)
這個代碼運行正常,據作者描述他的方法只在需要這張圖片時載入它而不是去讀取所有幀然後佔滿記憶體。我們先來看看CoreAnimation的“緩衝式”播放圖片的方法:
imageView =[[ UIImageView alloc ] initWithFrame : CGRectMake (0, 100, 320, 320)];imageView . animationImages =images;[images release ];imageView . animationDuration =10;imageView . animationRepeatCount =100;[ imageView startAnimating ];
基本思路就是有一個NSMutableArray的數組images,把圖片逐個載入到images中,再傳遞給imageView進行連續播放。
而他的方法則是在重複這一段代碼:
if ((frame >= animationNumFrames) || (frame < 0))return;NSData *data = [animationData objectAtIndex:frame];UIImage *img = [UIImage imageWithData:data];imageView.image = img;
似乎兩者的區別並不大,這裡的animationData也是預先把所有幀載入好的。而作者在這裡說的效率提升我認為在現在的開發環境中不會有太明顯的效果。
先分析這兩個,明天繼續!
===============================================
本文來自:http://blog.csdn.net/zh405123507
tags:iPhone開發 iOS開發 Xcode UITableView CoreAnimation