5

ナビゲーションバーをカスタムカラーに設定する必要があります。次のコードでそれを実行できます。

[[UINavigationBar appearance]
            setBackgroundImage:navigationBarTileImage forBarMetrics:UIBarMetricsDefault];

ただし、私のアプリケーションはシステムMFMailComposeViewControllerとMFMessageComposeViewControllerを呼び出し、ナビゲーションバーをこれらのビューのデフォルトの色にしたいので、次のようにしました。

[[UINavigationBar appearanceWhenContainedIn: [MyViewControllerBase class], [MyViewController1 class], [MyViewController2 class], nil]
    setBackgroundImage:navigationBarTileImage forBarMetrics:UIBarMetricsDefault];

ただし、ナビゲーションバーのデフォルトの色はなくなりました。なぜappearanceWhenContainedInが機能しないのですか?

4

2 に答える 2

21

引数appearanceWhenContainedIn:は、可能なコンテナーのリストではなく、ビュー(および/またはビューコントローラー)の包含階層を表します。(確かに、ドキュメントはこれについて明確ではありません。WWDC2011のビデオを参照してください。)したがって、

[UINavigationBar appearanceWhenContainedIn:[NSArray arrayWithObjects:[MyViewControllerBase class], [MyViewController1 class], [MyViewController2 class], nil]]

UINavigationBar内に含まれるの外観プロキシを提供しますMyViewControllerBase。これは、MyViewController1内に含まれますMyViewController2。それはあなたが持っている封じ込め階層ではないと思います。

代わりに、ナビゲーションバーが含まれているViewControllerを見てください。それはおそらく一般的なものUINavigationControllerです...しかし、あなたはただすることはできません

[UINavigationBar apperanceWhenContainedIn:[NSArray arrayWithObject:[UINavigationController class]]]

そうすれば、メール/メッセージコントローラーも入手できるからです。悲しいことに、メール/メッセージビューコントローラ内の外観プロキシを取得することはできますが、より一般的なレベルで行われた外観の変更を元に戻すように指示する方法はありません。UINavigationBar

このようなシナリオの通常の解決策は、自分でUINavigationControllerサブクラスを作成し、それをUIのスキンしたい部分に使用することです。サブクラスは空にすることができます。これは、のUIの一部を識別するためにのみ存在しますappearanceWhenContainedIn:。(一方、MFMailComposeViewControllerジェネリックを使用しているため、デフォルトの外観を引き続き使用しますUINavigationController。)

于 2012-08-08T01:53:13.827 に答える
0

実際、@ ricksterが言ったように、appearanceWhenContainedIn:メソッドは、コンテナークラスのインスタンスまたは階層内のインスタンス内に含まれるクラスのインスタンスの外観をカスタマイズします。

すべての場合に、カスタマイズしたい包含クラスのセットがあるわけではありませんが、異なるコンテナーがあります。複数のコンポーネントをカスタマイズできるようにするためのソリューションは、カスタマイズする必要のあるクラスの配列を作成し、反復するだけです。そのようです:

NSArray *navigationClass = [NSArray arrayWithObjects:[BSNavigationController class], [DZFormNavigationController class], nil];

for (Class class in navigationClass)
{
    //// Customize all the UINavigationBar background image tilling
    [[UINavigationBar appearanceWhenContainedIn:class, nil] setBackgroundImage:[UIImage imageNamed:@"yourImage"] forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBar appearanceWhenContainedIn:class, nil] setTintColor:[UIColor blackColor]];

    // Title Text Attributes
    NSDictionary *titleAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                     [UIColor whiteColor], UITextAttributeTextColor,
                                     [UIColor darkGrayColor], UITextAttributeTextShadowColor,
                                     [UIFont boldSystemFontOfSize:20.0], UITextAttributeFont,
                                     [NSValue valueWithUIOffset:UIOffsetMake(0, 1)], UITextAttributeTextShadowOffset,nil];

    //// Customize all the UINavigationBar title attributes
    [[UINavigationBar appearanceWhenContainedIn:class, nil] setTitleTextAttributes:titleAttributes];
}
于 2012-12-22T20:26:13.747 に答える