iPad壁纸尺寸问题

今天知道嘉实多要买100台iPad赠送给客户,我们要配合安装预置程序以及初始化设置。其中要设置壁纸。
把1024*768的图片设置为壁纸。发现有横过来尺寸符合,竖过来图片被放大,然后只显示图片中间部分。
所以,壁纸需要用1024*1024的图片进行设置,而且元素必须居于图片中心。

iPad和iPhone的Safari“添加至主页”功能自定义图标

今天知道嘉实多要买100台iPad赠送给客户,我们要配合安装预置程序以及初始化设置。其中要把嘉实多主页保存到iPad主界面上,但是图标需要自定义。

方法如下:

对收藏的页面加入代码:
<link rel="apple-touch-icon-precomposed" href="/icon.png" />
icon.png的尺寸是114×114,不需要做圆角和高光,iPad会自动加。

PS:如果不做如上设置,则iPad会对网页截图并做为图标。

类一定要继承

问题描述
今天做Denizen Box, 遇到一个奇怪的问题,问题描述如下:

2011-03-29 11:35:14.237 Box[6271:207] *** NSInvocation: warning: object 0x117c98 of class 'Config' does not implement doesNotRecognizeSelector: -- abort

问题分析
看到Config.h里:

@interface Config

没有继承任何类

问题解决
改成:

@interface Config : NSObject

一切安逸了。

iPad 图片加载效率

应朋友要做一个家具360展示的iPad App,故做了一些图片加载的效率测试。之前做AD杂志,也是遇到iPad加载图片速度不快的问题,特别是大图。

今天做了一些测试,本测试使用的是cocos2d类库。最终效果由5个层叠加而成:主背景层、壁纸层、地毯层、沙发层、茶几层,都是带透明通道的。

首先,用1920×1080图片进行测试,5层一套加载时间为2秒多。1层加载完成帧率是30,5层加载完成帧率8.6。

再次,用1024×768图片进行测试,5层一套加载时间为1秒多。1层加载完成帧率是30,5层加载完成帧率7.5。

以上为模拟器上测试,真机上测试结果差不多,但是帧率会高很多。采用单张图片即时load速度肯定跟不上,所以以下测试采用预load图片的方法进行测试。

用1024×768图片(每张图片500K左右)1层进行测试,预load内存到25M的时候内存不足,iPad中止。模拟器上因为没有内存限制,load好后非常流畅。

压缩图片到每张50K,用1层640×480带透明通道的图片拉大到1024×768,在真机上可以跑到60帧。但是当用2层640×480图片进行测试,发现内存急速增长,在内存使用达到20M的时候崩溃自动推出。说明,带透明图层不光会占用CPU资源,对内存资源也消耗巨大。在今年iOS开发者大会上,美国佬也是腔调了这一点,能关透明的时候尽量关闭透明,以增加帧率。

后缩小第二层图片的尺寸,内存还是几何型增长。最后放弃了多图层。

所以360展示,现在只能使用一张图片,而不能使用多图层叠加方式。

cocos2d 0.99.5需要手动开启多点触摸支持

问题描述
这几天做Denizen Box,碰到不支持多点触摸,只能单点。

问题分析
使用的代码和之前Puzzle使用的是一样,唯一不同的是类库的版本。
Box使用的是cocos2d 0.99.5,而Puzzle使用的是cocos2d 0.99.4。

问题解决
0.99.5取消了自动多触点支持,所以要手动启用。

在AppDelegate.m的- (void) applicationDidFinishLaunching:(UIApplication*)application中加入:
viewController.view.multipleTouchEnabled = YES;

plist保存问题

问题描述
今天做Denizen Box,需要收集用户资料,用[NSDictionary writeToFile: atomically:]方法保存。模拟上此函数成功,返回true;真机上此函数失败,返回false。

问题分析
代码如下:

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"];
bool result=[addDictionary writeToFile:plistPath atomically:YES];

代码没有变化,而真机就是写入不了,猜想是权限问题。

问题解决
把代码改为:

NSArray *storeFilePath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *doucumentsDirectiory = [storeFilePath objectAtIndex:0];
NSString *plistPath=[doucumentsDirectiory stringByAppendingPathComponent:@"data.plist"];
bool result=[addDictionary writeToFile:plistPath atomically:YES];

问题解决了。

事后发现,路径不一样:
修改前:

/var/mobile/Applications/A528A4DE-F391-4247-8C5D-9386DC415A00/Box.app/data.plist

修改后:

/var/mobile/Applications/A528A4DE-F391-4247-8C5D-9386DC415A00/Documents/data.plist

不同SDK对pathForResource函数兼容问题

问题描述
前些天做AD iPad版,程序在4.2版本的iPad上运行良好,但是安装到3.2版本的iPad上有些功能点load不出。

问题分析
设置断点,一步一步跟踪,查找到:

// init position
NSString *plistPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%d/feature_point",[self getPage]] ofType:@"plist"];
_positions=[[NSDictionary alloc] initWithContentsOfFile:plistPath];

以上代码plistPath值为空,查找这句中所有的语句的SDK支持,都只要SDK2.0,而我们是3.2,完全符合。

问题解决
一步一步排除,最后焦点在pathForResource: ofType:函数,查找SDK的时候发现另有一个函数是pathForResource: ofType: inDirectory:函数,把该句改为:

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"feature_point" ofType:@"plist" inDirectory:[NSString stringWithFormat:@"%d",[self getPage]]];

问题解决了!!!

Project Settings的设置bug

问题描述
帮客户的iPad安装AD demo,机器SDK是4.2.1,客户iPad SDK是3.2,直接developer debug不成功。

问题分析
把“Project Settings”的"Build"选项卡里的"Base SDK"设置为"Latest iOS"(最高),并把"iOS Deployment Target"设置为"iOS 3.0"(最低)。

问题解决
网上查了下,看到一老外的解决办法,如下:

I believe the only requirement is that you edit and resave the info.plist file. I editted to 1.7, saved, and then back to 1.0 and it worked fine.

It may be that XCode is binding in additional details from the build settings at the time of packaging and since the info.plist hadn't changed those additional bindings did not get attached. If this is the case I would consider it a bug.

我也认为是一个iOS的Bug,只有修改info.plist才会导致project settings设置生效。

UIImageView frame设置顺序问题

问题描述:
今天做AD ipad版展示功能点,背景不显示。

问题分析:
检查代码,其他都没什么问题。发现设置frame在设置image之前。

代码如下:

UIImage *backgroundImage=[UIImage imageNamed:BACKGROUND_FILE_NAME];
_backgroundImageView=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)];
_backgroundImageView.image=backgroundImage;

问题解决:
把设置frame代码放置在设置frame之后,一切安逸了。

代码如下:

_backgroundImageView=[[UIImageView alloc] init];
UIImage *backgroundImage=[UIImage imageNamed:BACKGROUND_FILE_NAME];
_backgroundImageView.image=backgroundImage;
_backgroundImageView.frame=CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height);

UIButton click不触发问题

问题描述:
今天做AD的ipad版展示功能点,为UIButton加入点击事件后,没有调用效果。

问题分析:
代码如下:

[button addTarget:self action:@selector(groupClicked:) forControlEvents:UIControlEventTouchUpInside];

- (void)objectClicked:(id)vSender
{
}

objectClicked方法没有被调用。查了下,addSubView等都没问题。突然想到父类是UIView,frame没有设定过。

问题解决:
设定frame:self.frame=CGRectMake(0,0,768,961);

一切安逸了。