iOS 5提供了一个新的framework – Newsstand framework,它允许把应用程序运行于News Stand中。实际上,News Stand相当于一个特制的文件夹专门放置报纸,杂志类应用程序。由于时间有限,这里我分几个部分介绍这一技术。
首先介绍的就是怎样把一个应用程序改变成一个News Stand程序,这实际上有两步工作,一是让程序运行于News Stand,二是改变程序的图标。
读文章 »
-
21
Oct 11
7 comments -
25
Aug 11我有一个项目其中某些UIView必须以特定的方向(Portrait或者Landscape)显示。这个看似简单的问题,困惑了我很久,直到今天我才完全找到解决的方法。
读文章 » -
28
Jul 11昨晚装上了Lion(10.7),从App Store下载了Xcode 4.1,App Store果然了得,速度非常快,3点多g的东西,只花了我1个小时。兴冲冲地安装后,编译我最新的程序,然后准备放些内容到Simulator下的Documents文件夹下进行测试,问题来了。整个Library目录从用户目录下完全消失了。难道Apple又来了个“乾坤大挪移”?经过研究发现,原来Library目录还在原来的地方,只是被Apple隐藏起来了,这点非常令人不解,其系统下的Library目录都没有隐藏,用户目录下的Library倒被隐藏了。
解决方法非常简单:
chflags nohidden $HOME/Library
再打开Finder,你就可以在你的用户目录下看到Library了。
-
24
May 11有的时候,我们需要把做好的项目以另外的程序名和内容重新打包,当然我们可以使用建立一个新的target的方法,不同的情况用不同的target表示。我一位朋友luckywr分享了一种更为简单的方法,特别适合于只需少量更改了项目的内容(比如,更改程序的图标)。其思路也非常简单,就是在更改内容后使用命令行对app重新进行数字签名,而不需要再次对整个程序进行编译了。
下面是他使用的方法:
codesign -f -vv -s [Identity] [appPath]
Identity 是授权文件,是在keychain里使用的私钥的名字。
比如:codesign -f -vv -s “luckywr” /Users/luckywr/Desktop/xxxx.app
在此感谢luckywr朋友。
-
13
May 11我们经常会遇到这种情况,某个按钮太小很难按到,又不想把按钮图片做得太大。我把它作成了一个Class Method,放在了我的Utils类中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15+(void)resizeTouchableAreaForButton:(UIButton* )button withNewSize:(CGSize)size
{
// increase margin around button based on width
const CGFloat margin_h = 0.5f * ( size.width - button.frame.size.width );
const CGFloat margin_v = 0.5f * ( size.height - button.frame.size.height );
// add margin on all four sides of the button
CGRect newFrame = button.frame;
newFrame.origin.x -= margin_h;
newFrame.origin.y -= margin_v;
newFrame.size.width += 2.0f * margin_h;
newFrame.size.height += 2.0f * margin_v;
button.frame = newFrame;
}这段代码把按钮的可按区域扩大到新的尺寸。不过有一个前提是使用UIButton的setImage而不是setBackgroundImage来设置按钮图片。
-
25
Mar 11iOS 4引进了所谓多任务,可以让程序运行于后台,不过对目前大部分程序而言这只是一个鸡肋。有没有办法直接在用户按下Home键后像iOS 4之前的程序一样直接退出呢?方法如下:
- 打开info.plist
- 加入 UIApplicationExitsOnSuspend 或者选择“Application does not run in background(程序不运行于后台)”
- 将其设为 YES
-
10
Mar 11我有一个程序需要检测UIWebView是否有touch动作,不幸得很,UIWebView上的touchesBegan等事件无法被检测。在网上查了一下,有许多解决方法,比如在UIWebView上再加一个透明的UIView,重置UIWindow的sendEvent或重置UIWebView的hitest方法等等,要么就是方案不太完美,要么就是太过复杂,经过实验我使用的这种方法最为简单(否则我也没有时间写在这里了),当然我只要求检测UIWebView上有touch动作即可。我的方法是使用UITapGestureRecognizer。关键的地方有两点,请看我的代码(我的代码是在一个UIViewController中):
1
2
3
4
5UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];
singleTap.delegate = self;
singleTap.cancelsTouchesInView = NO;
[singleTap release];
第三行是第一个关键的地方,就是必须设置UITapGuestureRecognizer的delegate(一般我们直接使用initWithTarget,无需设置其delegate)。
第二个关键的地方是在下列delegate方法return YES。
1
2
3
4- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
做到这两点,你的UIWebView就可以响应touch事件了,你可以使用不同的UIGestureRecognizer来满足你不同的要求等。(handleSingleTap方法请自行补上)。 -
23
Feb 11最近一个客户向我汇报了一个程序的问题。经过分析发现问题是NSURLConnection没有正常工作。记得以前测试时没有问题啊。后来上网查到原来在iOS 4.0以后,NSURLConnection无法在NSOperation中正常运行,换句话说,NSURLConnection只能运行于主线程。解决方法其实倒是蛮简单(比如我的程序在download中):
1
2
3
4
5
6
7
8
9
10
11
12-(void)download
{
// NSURLConnectionn won't work if it's not in the main thread
if (![NSThread isMainThread])
{
[self performSelectorOnMainThread:@selector(download) withObject:nil waitUntilDone:NO];
return;
}
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:_urlString]];
_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
} -
3
Jan 11众所周知,ipa实际上就是一个zip文件,通过解压,可以在Payload目录下得到一个app文件,实际上这个app文件就是一个文件夹,当然windows下,用户很容易就知道这一点。在Mac下,用户需要将app更名。进入此目录后,ipa中的所有resource文件都尽收眼底了。不过,所有的png文件都无法读取。这是由于Apple在将png打包加入ipa之前将png以一种特殊格式存放,要读取此格式就要破译Apple所采用的png格式了。
不过幸运的是,有人已经做了这部分工作,见iPhone PNG Images Normalizer Python,这里是采用python对png进行转换,大家如果有兴趣,可以仔细读一下源代码,如果只是想获取可读的png文件,请在上述网站进行下载或在本地下载ipin.py.zip。
此python程序的使用方法很简单,当然首先系统中要求安装了python。解压ipin.py.zip后,将ipin.py文件复制到刚才解压的包括所有png文件的目录下,然后运行:
python ipin.py
回答Y,所有的png将被转换成通常的png格式,这样你使用预览程序就可以看到了。
-
4
Nov 10这几天测试IAP时,总是出现下列错误:
You’ve already purchased this but it hasn’t been downloaded…..
然后就是,Transaction Failed,错误原因是:无法连接iTune Store。上网查了一下很多人说是iTunes Store的问题,等几天就好了,但我用另一个iDP的账户又没有问题。进过调试,最后发现问题出在iTune Store 的 test account上,原来我没有为新iDP账户创建test account,这原来是个低级错误,不过Apple的错误信息也太容易误导人了吧?



