0

目的: 私の UINavigationBar は、特定の背景と特定のラベル フォントでカスタマイズする必要があります。

これは、外観プロトコルを使用して iOS5 で簡単に実現できます。Ok。

ユーザーが iOS5 未満を実行している場合はどうなりますか? デフォルトの UINavigationBar が表示されますが、drawRect をオーバーライドするカテゴリで UINavigationBar を拡張すると表示されません。

質問 1: Prefix.pch で、iOS バージョンに応じて UINavigationBar カテゴリ拡張の条件付き #import を指定するにはどうすればよいですか?

質問 2:質問 1 をなんとか解決できたと仮定すると、これはうまくいきますか? つまり、デバイスが iOS5 でない場合、[UINavigationBar] の外観を設定するのではなく、カテゴリをインポートするだけです。さらに何かする必要がありますか?

編集:これはウラジミールの提案の実装です。現在、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 でこれを行うことはできないと思います。これはコンパイル時であり、アプリ ストアにアップロードできるバイナリは 1 つだけです (これは iOS バージョンに依存しないはずです)。代わりに、実行時にこれをテストできます。たとえば、drawRect をオーバーライドできますが、iOS のバージョンに応じて、 super を呼び出すか、独自のコードを実行します。

編集:

私の提案は、元の実装を置き換えるため、単純なカテゴリでは機能しません。少なくとも 2 つの選択肢があります。

  1. UINavigationBar をサブクラス化し、drawRect をオーバーライドします。
  2. 既存の UINavigationBar インスタンスで drawRect を入れ替えるメソッド。
于 2012-05-08T09:07:49.467 に答える