本文翻译自 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];
}
代码可以顺利运行。但是按目前的“流行标准”来看,似乎这样的设计基本是用不到了。在此推荐另一种“多层级”的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 ];
而他的方法则是在重复这一段代码:
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