我今天开始玩iOS 5了,我发现XCode 4.2只让我选择iOS 5作为Base SDK而不是iOS 4。
到目前为止,我已覆盖UINavigationBar中的drawRect:方法来自定义其外观,但iOS 5不再调用该方法。现在我要使用[UINavigationBar外观]来做它(我认为这要好得多)。但是,外观方法仅适用于iOS 5,因此如果我使用它,我的应用程序在iOS 4上执行时会崩溃。我该怎么办?我是否必须在每个使用iOS 5方法的地方检查iOS版本的宏?
谢谢,
爱丽儿
答案 0 :(得分:16)
您的第一个问题的答案是:您必须使用iOS5(或最新的iOS SDK)作为基本SDK,但您在部署目标下设置了受支持的最低iOS版本。在那里你可以设置iOS4.0(或任何你想要的)。
处理第二个问题的正确方法是测试功能,而不是版本。所以,像这样的东西可以说是你的application:didFinishLaunchingWithOptions:
方法:
// iOS5-only to customize the nav bar appearance
if ([[UINavigationBar class] respondsToSelector:@selector(appearance)]) {
UIImage *img = [UIImage imageNamed: @"NavBarBackground.png"];
[[UINavigationBar appearance] setBackgroundImage:img forBarMetrics:UIBarMetricsDefault];
}
然后您将针对iOS5 SDK进行编译,因此完全使用appearance
就可以了。但是当这个编译的代码在5之前的iOS版本上运行时,它会没问题。
如前所述,您可以按原样保留drawRect:
代码。
答案 1 :(得分:3)
另一种自定义标题的方法就是这样。
UIImage *image = [UIImage imageNamed:@"header.png"];
if([navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] ) {
//iOS 5 new UINavigationBar custom background
[navigationBar setBackgroundImage:image forBarMetrics: UIBarMetricsDefault];
}
else{
UIImageView *imgView = [[[UIImageView alloc] initWithImage:image] autorelease];
[imgView setUserInteractionEnabled:NO];
[imgView setTag:TOOLBAR_TAG];
[navigationBar insertSubview:imgView atIndex:0];
}
使用 respondsToSelector ,您可以知道该功能是否在此处。
答案 2 :(得分:0)
您可以将相同的代码放在iOS 4使用的drawRect和[UINavigationbar appearance]返回的代理中。两种不同的代码路径。
答案 3 :(得分:0)
您不能使用宏来执行此操作,因为两个代码路径都必须到位并且正确的路由取决于运行时检查。
Soooo ......使用这样的东西:
NSString *os_version = [[UIDevice currentDevice] systemVersion];
获取您当前正在运行的iOS版本并在5&amp ;;下执行[UINavigationBar外观]更新,你可以回到iOS 4上的drawRect事物。
答案 4 :(得分:0)
还可以下载适用于iPhone和iPad的4.3模拟器。然后,当您在4.3上意外使用iOS 5时,您可以更快地崩溃 --Tom