我应该怎么做才能使我的应用程序适应iOS 5.0,保持与iOS 4的兼容性

时间:2011-10-14 19:06:00

标签: iphone objective-c ios ios5

我今天开始玩iOS 5了,我发现XCode 4.2只让我选择iOS 5作为Base SDK而不是iOS 4。

到目前为止,我已覆盖UINavigationBar中的drawRect:方法来自定义其外观,但iOS 5不再调用该方法。现在我要使用[UINavigationBar外观]来做它(我认为这要好得多)。但是,外观方法仅适用于iOS 5,因此如果我使用它,我的应用程序在iOS 4上执行时会崩溃。我该怎么办?我是否必须在每个使用iOS 5方法的地方检查iOS版本的宏?

谢谢,

爱丽儿

5 个答案:

答案 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