刚开始学习iOS。其实连Mac电脑都是第一次摸……从第一天刚用Mac的时候完全不了解快捷键,连Ctrl C V 这种操作都练了好久才熟练。没有Home End什么的真心纠结,连Delete键都没有……我用的是那种蓝牙小键盘你懂的。
前几天看看书,熟悉熟悉环境,然后前辈给任务说做一个相册程序练练手。写了四天时间终于搞定了。一开始什么都不知道,比如ImagePicker和Three20什么的。后来尝试用ImagePicker实现,结果前辈表示不怎 么想让我用那种过于现成的方法……于是~~就开始学习Three20。好纠结,纠结了好久之后终于明白看Sample和源代码才是硬道理。
从开始使用320开始,遇到的问题都写一下好了。
1. Three20的配置。
网上有很多这方面的内容,但感觉内容都差不多。我用的是直接敲命令的方式,屡战屡胜轻松愉快。建好了工程之后在终端输入
python path/to/Three20/src/scripts/ttmodule.py -p path/to/project/project.xcodeproj Three20 --xcode-version=4
这命令感觉上是跟xcode的版本有些相关的。不知道有没有大神更了解的。
因为经常有些时候需要修改Three20的源代码,所以么最好是把Three20复制一份到自己的工程里面。
2. 模拟器运行时所在的目录
既然要写一个相册,就要有图片才行。既然要有图片,就要想办法把图片放到程序目录里面去才行。iPhone的目录控制大家都懂,程序的ID所在的目录下面有个documents用来存放这种文件的。网上也容易查到这个路径,是 ~/Library/Application Support/iPhone Simulator/4.3/Applications/[app GUID] 。但是对于一个第一次用Mac的人,真心找不到这路径……后来纠结了半天,才明白~/Library 是个隐藏目录。要么在Finder中按住option键点“前往”,要么在命令行里面敲个命令 chflags nohidden ~/Library/
3. 根据Three20的Samples示例来写相册。
网上这种教程还不少的(虽然感觉内容也差不多- =),看完了之后感觉还是自己看源码最实在。在samples的TTCatalog,里面的ThumbsView就是需要参考的示例。源文件部分要看的么基本就是AppDelegate(作为程序的入口,最清晰易懂)、MockPhotoSource(貌似是用来管理图片的- -最看不懂)和PhotoTest2Controller(用来对图片来源进行初始化等等,要说最重要么,或者说最需要动手术)。将这三个文件的功能提取出来放到自己的项目当中,就OK了。别忘了包含需要的Three20.h之类的。
虽然这样做是很方便的,不过也是有很多问题的。主要是对图片来源进行初始化……那一大串[MockPhoto alloc]initWithURL …… 让谁看了都蛋疼的紧吧。其实还是有很多地方可以做得更好的。
4. 将图片来源从网址改为文件系统。
网上也是很容易找到,只要把网址那个改成@"documents://......./a.jpg"之类的就行了。要注意的问题一是documents要小写而且别漏了s,二是…我不知道怎么能让它直接访问NSHomeDictionary目录。
值得一讲的是,有可能你在运行的时候,即使运行正常了也会在图片中间显示一个Connection Error (我说的是运行正常,图片也能正常显示的情况)。这个问题我至今不知道是为什么,但把图片都放到程序的resources文件夹中,然后将URL改为@"bundle:// " ,确实可以解决这问题。更扯淡的是,我过了两天又运行了一次,@"documents:// "的,这次又正常了,后来也没再次出现这问题。如果有遇到同样情况的大虾,请把经验什么的分享一下,小弟感激不尽。
5. 既然一张一张初始化图片很麻烦
我们用一个循环来让它自动初始化就好了。
思路是这样:读取当前路径下的所有文件,然后筛出后缀为.jpg的,将它的路径格式化一下作为NSString,就可以放在initWithURL里面了。不过那样的话,我就没有直接在self.photoSource中一个一个init,而是先建一个NSMutableArray,之后在循环中对这NSMutableArray不断地addObject,将MockPhoto添加进去。添加的时候会自动将路径设为@"documents://"+当前目录+图片名 的形式,个人感觉是很方便的。
把所有内容添加进NSMutableArray之后,作为参数传给self.photoSource的photos就行了
6. 你在想怎么才能筛出后缀为.jpg的文件么?
按照“.”对文件名进行分割,然后取其最后一段,与@"jpg" 对比一下就行了。
比如文件名是一个叫做content的NSString的话,那么只要
NSArray *chunks = [content componentsSeparatedByString:@"."];
就可以进行分割。之后再使用
if ([[chunks objectAtIndex:[chunks count]-1] isEqualToString:@"jpg"] )
就可以筛选出来后缀为.jpg的文件了。
7. 但你一定还在想MockPhoto初始化时要手动输入size也很麻烦。
那么我们就用程序自动读取图片的高和宽,自动传进去就行了。使用UIImage类可以完美做到这点。传入参数就是CGSizeMake(img.size.width,img.size.height); 轻松愉快。
------------- -------------
最后我写出来的是个这样的程序:
建一个基于导航的项目
有RootViewController、PhotoAppDelegate、PhotoViewController和MockPhotoSource。
手写一下RootViewController,用于显示指定目录中的所有相册。点击任意相册就进入PhotoViewController。
剩下的三个分别对应Three20那个TTCatalog示例中的AppDelegate、PhotoTest2Controller、MockPhotoSource
有很多功能我并没有实现。
1. 应该自定义rootView中的Cell,使其能够显示相册中的某一张图片。并显示相册中的图片数目。而不是只显示下级相册的名称
2. 如果相册内还有相册的话应该如何进行显示呢?
3. 图片显示到最后一张的时候如何能够自动循环到第一张。
4. 边栏目前只能在点击的时候隐藏,如何能够使其过两秒自动隐藏?
5. 显示图片缩略图的时候,应该在最下部显示该目录的相片数……吧。
6. 幻灯片播放功能,320应该有实现才对吧,回头继续翻源码。
-------------------------------
以上。