优化UITableView性能

标签:Objective-C, iOS开发

在iOS应用中,UITableView应该是使用率最高的视图之一了。iPod、时钟、日历、备忘录、Mail、天气、照片、电话、短信、Safari、App Store、iTunes、Game Center⋯几乎所有自带的应用中都能看到它的身影,可见它的重要性。
然而在使用第三方应用时,却经常遇到性能上的问题,普遍表现在滚动时比较卡,特别是table cell中包含图片的情况时。
实际上只要针对性地优化一下,这种问题就不会有了。有兴趣的可以看看LazyTableImages这个官方的例子程序,虽然也要从网上下载图片并显示,但滚动时丝毫不卡。
下面就说说我对UITableView的了解。不过由于我也是初学者,或许会说错或遗漏一些,因此仅供参考。

迟到的2011 ChinaJoy游记

标签:ACG

上周六又去逛了下ChinaJoy,这也是我在上海的惯例了。不过由于太累,日志也就拖到今天才放出了,不过Google+上都已经都放过了。看不到图的自行翻墙,其实改hosts即可。

利用预渲染加速iOS设备的图像显示

标签:Objective-C, iOS开发

最近在做一个UITableView的例子,发现滚动时的性能还不错。但来回滚动时,第一次显示的图像不如再次显示的图像流畅,出现前会有稍许的停顿感。
于是我猜想显示过的图像肯定是被缓存起来了,查了下文档后发现果然如此。
后来在《Improving Image Drawing Performance on iOS》一文中找到了一些提示:原来在显示图像时,解压和重采样会消耗很多CPU时间;而如果预先在一个bitmap context里画出图像,再缓存这个图像,就能省去这些繁重的工作了。

GAE SDK 1.5.2版发布

标签:Google App Engine

今早起来发现GAE SDK 1.5.2版发布了,不过工作太忙就无暇顾及了,于是现在补上更新列表:

  • 可以在管理员控制台的Application Settings页面里设置最大空闲实例数和最小等待时间。
  • 索引中有重复字段的不会再报索引爆炸的警告。
  • SDK支持并行的数据库事务。
  • Datastore的stats API支持按namespace查询。
  • 管理员控制台的Task Queues页面可以显示请求头、过去的运行信息和任务的payload。
  • Pull queue可以用modify_task_lease()来修改lease(租期和任务数)。
  • Pull Task的最大尺寸增加到1MB。
  • 可用appcfg.py的"backend configure"指令来修改backend instances数目,而无需先停止instances。
  • Mail API可设置References和In-Reply-To头。
  • SDK的APPLICATION_ID环境变量将含dev~前缀。获取app id的推荐方式是用appidentity.get_application_id()。可以使用--default_partition参数来修改这个前缀(后面会附加一个“~”符号)。
  • Deferred API的defer()可接收_target参数,用于指定应用的version或backend。
  • db.Model增加to_dict()实例方法。
  • Images API增加get_original_metadata()方法来获取图像的EXIF信息。
  • db.py增加@transactional装饰器,用于标注一个函数用于执行事务。

此外,Go SDK的进展很慢,看上去还是个玩具…

为视网膜显示屏优化网页上的图片

标签:HTML, JavaScript, iPhone, CSS

说起iPhone 4带来的革新,retina display绝对是最吸引眼球的一项,以至于我现在看电脑的显示屏时,都能看到满屏幕的像素点了⋯

正是依赖这视网膜显示屏,iPhone 4的分辨率达到了640×960 pixels;不过为了保持向下兼容性,它采用的仍然是320×480 points。
也就是说,在不进行缩放的情况下,显示普通图片时,它会用4个像素来显示图片中的1个像素;而在显示retina图片时,每个像素都对应图片中的1个像素。
如此一来,老的应用无需修改就可以在iPhone 4上运行了——虽然显示效果差了点,但是不会出现只有左上角那1/4的区域有内容的情况。

在用iOS SDK开发iOS应用时,只要将图片名加上“@2x”后缀,就能让支持retina display的设备自动显示这个解析度更高的图片。
但Safari等使用UIWebView的应用在展示图片时,却无法利用这个特性,因为这样可能会造成大量没必要的HTTP请求。
既然不能自动实现,那就只能手动来弄了。原理很简单,准备2种图片,当检测到支持retina display时,就显示大图,然后把图像的长宽各缩小一半即可。

Google Reader API简介

标签:Python, RSS, Google Reader

Google Reader是我最喜欢的web服务,可惜在iPhone上没有一个我理想中的客户端,所以只好自己动手丰衣足食了。
而开发的第一步自然就是搞定Google Reader API,可惜Google一直没有放出官方文档。所幸的是前人已经通过反向工程探寻出了相关信息(GoogleReaderAPIUnofficial Google Reader APIgoogle reader api 介绍Using the Google Reader APIGReader-Cocoa等),所以不用自己去一一摸索了。
不过文档有点老了,这期间Google也稍微改了一些东西,所以还需要稍作修正。

iOS开发之免改hosts翻墙

标签:Objective-C, iOS开发, GFW

在开发iOS的web应用时,不可避免地会遇到一些被墙的网站。使用VPN或代理服务器自然是可以解决的,不过成本比较高。而Google的大部分服务都有很多IP,可以通过修改hosts文件来翻墙访问,但在iOS设备上却需要用户去越狱才能修改,显得颇为不便。
好在HTTP请求其实也是使用socket,在请求前要用socket连接服务器,提供域名/IP和端口,这里只要改成可用的IP就能连上了。在连接之后,还要提供访问方法、路径、Host等其他头字段,这里只要把Host改成原本的域名即可。

WGS84坐标转火星坐标(iOS篇)

标签:Objective-C, iOS开发

在这个神奇的国度里,我们总得学习一些有中国特色的东东,例如“火星坐标”。也许有人还不知道这是什么玩意,我就简要介绍一下吧。
如果你有带GPS模块的智能手机,打开定位功能,然后访问Google地图。只要你身处中国大陆,你就会发现定位不准,大概有几百米的偏差。然而运行一些导航软件,你又会发现定位很准确,说明手机的GPS模块确实是正常的。
这种现象是怎么造成的呢?答案是人为造成的。简单来说,GPS模块获取到的坐标是WGS84坐标系的,中国政府出于种种目的的考虑,不允许中国的地图使用国际通用的WGS84坐标系,而非要加上一些偏移,这样的坐标系就俗称“火星坐标系”。而Google地图采用的也是加偏移过的火星坐标系,但GPS模块传给它的坐标却没有加偏移,于是就出现几百米的偏差了。

开发iOS平台的猜数游戏

标签:Objective-C, iOS开发

这些天终于戒掉了星际争霸2,开始学习iOS开发了。虽然还只是一知半解,但学了几天后,觉得单视图的iOS应用开发起来太轻松了,就忍不住想自己动手做点小玩意。
我也没有什么好的创意,只是偶然看到猜数的游戏,觉得用选取器这个控件很适合,就决定做了。

搭建无iDP证书的Xcode环境

标签:iOS开发

众所周知,开发iOS应用需要注册iOS Developer Program(iDP)。不过这玩意需要99美元/年,只是玩玩而已的话就显得太贵了。好在不注册也可以用模拟器测试,但是不在iOS设备上测试总觉得不爽,于是便在网上找到了解决办法。

« 看看还有什么好玩意