仅在iOS5时有条件导入头文件

时间:2012-05-08 09:02:30

标签: objective-c ios uinavigationbar customization

目标:我的UINavigationBar必须使用特定背景和特定标签字体进行自定义。

这在iOS5中可以通过外观协议轻松实现。确定。

如果我的用户运行< iOS5的?他将看到默认的UINavigationBar,但是如果我使用覆盖drawRect的类别扩展UINavigationBar则不会。

问题1:如何根据iOS版本在Prefix.pch中指定UINavigationBar类别扩展的条件#import?

问题2:假设我设法解决问题1,这会有效吗?我的意思是,如果设备不是iOS5我没有设置[UINavigationBar]外观]但只导入类别,我是否需要做更多的事情?

编辑:这是Vladimir建议的实现,我现在没有iOS4设备或模拟器来测试它,但我认为它可能有用。

@implementation UINavigationBar (iOS4Appearance)

- (void)drawRect:(CGRect)rect 
{
    if (self.isiOS5) {
        [super drawRect];
    } else {
        UIImage *background = [UIImage imageNamed: @"navigation-bar"];
        [background drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    }
}

- (BOOL)isiOS5
{
    return [[[UIDevice currentDevice] systemVersion] floatValue] >= 5.0;
}

@end

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

我认为你不能用#import做这个,因为那是编译时间,你只能将一个二进制文件上传到应用程序商店(应该是iOS版本独立的)。相反,您可以在运行时测试它。例如,您可以覆盖drawRect,但根据iOS version,您可以调用super或运行自己的代码。

编辑:

我的建议不能使用普通类别,因为它们取代了原来的实现。至少有两种选择:

  1. 对UINavigationBar进行子类化并覆盖drawRect。
  2. Method swizzling现有UINavigationBar实例上的drawRect。