1

UIBarButtonItemaに埋め込まれているときにa をカスタマイズしようとしていUINavigationBarます。

背景画像とタイトル テキスト属性をカスタマイズしたいと思います。

ただし、ナビゲーション バーが に含まれている場合、UIPopoverControllerこれらのカスタマイズを実行したくありません。

これは私のコードです:

//1. 
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationController class], nil] 
    setBackgroundImage:[UIImage imageNamed:@"navigationBarBackgroundNormal"] 
    forState:UIControlStateNormal 
    forBarMetrics:UIBarMetricsDefault];

//2. 
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationController class], nil] 
    setBackgroundImage:[UIImage imageNamed:@"navigationBarBackgroundHighlighted"] 
    forState:UIControlStateHighlighted 
    forBarMetrics:UIBarMetricsDefault];

//3. 
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationController class], nil] 
    setTitleTextAttributes:@{UITextAttributeTextColor:[UIColor blueColor]} 
    forState:UIControlStateNormal];

//4. 
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationController class], nil] 
    setTitleTextAttributes:@{UITextAttributeTextColor:[UIColor whiteColor]} 
    forState:UIControlStateHighlighted];

//5. 
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationController class], [UIPopoverController class], nil] 
    setBackgroundImage:nil 
    forState:UIControlStateNormal 
    forBarMetrics:UIBarMetricsDefault];

//6. 
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationController class], [UIPopoverController class], nil] 
    setBackgroundImage:nil 
    forState:UIControlStateHighlighted 
    forBarMetrics:UIBarMetricsDefault];

//7. 
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationController class], [UIPopoverController class], nil] 
    setTitleTextAttributes:nil 
    forState:UIControlStateNormal];

//8. 
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationController class], [UIPopoverController class], nil] 
    setTitleTextAttributes:nil 
    forState:UIControlStateHighlighted];

問題は
、ナビゲーション コントローラーをポップオーバーの contentViewController として作成することです。
別のView Controllerが押されると、戻るボタンが自動的に作成され、適用される外観は5、6、7、8行目からのものです-これは良いことです。

ただし、新しいものを作成しUIBarButtonItemて として割り当てると、rightBarButtonItem代わりに行 3、4、5、6 が適用されます (つまり、外観プロキシは、何らかの理由で、行 3、4 のタイトル属性を適用しましたが、ナビゲーション バーはしかし、背景画像に関しては、外観プロキシは行を正しく適用しました 5,6)

ナビゲーション バーがポップオーバーにない場合、すべて正常に機能します (1、2、3、4 行目が適用されます)。

UIBarButtonItemナビゲーションコントローラーがポップオーバーにあるときに、外観プロキシが戻るボタンに対しては正常に機能するのに、作成中のプロキシでは機能しない理由がわかりません。

4

1 に答える 1

0

ドキュメントのこの段落が役立つと思います:

どのビュー階層でも、最も外側の外観プロキシが優先されます。特異性 (チェーンの深さ) がタイブレーカーです。つまり、appearwhenWhenContainedIn: の包含ステートメントは、半順序として扱われます。具体的な順序付け (実際のサブビュー階層) が与えられると、UIKit は、ウィンドウから実際の階層を読み取るときに、最初に一意に一致する部分的な順序付けを選択します。

UIAppearance プロトコル リファレンス

于 2013-11-21T16:00:17.130 に答える