0

目标:我的 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

谢谢你的帮助。

4

1 回答 1

3

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

编辑:

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

  1. 继承 UINavigationBar 并覆盖 drawRect。
  2. 在现有 UINavigationBar 实例上调整 drawRect 的方法。
于 2012-05-08T09:07:49.467 回答