4

次のコードを使用してUINavigationBarカスタムイメージを設定しています。UIToolbar

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navigationBar"] forBarMetrics:UIBarMetricsDefault];
[[UIToolbar appearance] setBackgroundImage:[UIImage imageNamed:@"toolbar"] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];

私はPhotoViewerを使用しており、そのビュー コントローラーをビューにプッシュしています。半透明のナビゲーションバーとツールバーが必要ですが、代わりに私が提供した半透明のグラフィックを使用しています。

問題は、後で別のビュー コントローラーをプッシュしたときに (PhotoViewer からスーパーに戻った後)、そのツールバーも半透明であり、コンテンツがその背後にあることを意味します。

私は運なしで次のことを試しました:

[[UINavigationBar appearanceWhenContainedIn:[EGOPhotoViewController class], nil] setBarStyle:UIBarStyleBlackTranslucent];
[[UINavigationBar appearanceWhenContainedIn:[EGOPhotoViewController class], nil] setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
[[UIToolbar appearanceWhenContainedIn:[EGOPhotoViewController class], nil] setBarStyle:UIBarStyleBlackTranslucent];
[[UIToolbar appearanceWhenContainedIn:[EGOPhotoViewController class], nil] setBackgroundImage:nil forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];

PhotoViewer のためだけに黒い半透明の barStyle を実現し、カスタム グラフィックスで他のすべてを保持する方法はありますか?

更新:ヘルプを得るために、ナビゲーション バーのカスタム グラフィックを使用してサンプル プロジェクトを作成し、外観プロキシを使用するときに半透明のナビゲーション バーでプッシュされたビュー コントローラーを表示しようとしましたが、成功しませんでした: サンプルプロジェクト

4

2 に答える 2

4

サンプル プロジェクトをダウンロードして修正しました。何が問題なのか説明します。

まず、UINavigationBar は UINavigationController 内に含まれています。したがって、RootViewController と TranslucentViewController は同じ UINavigationBar インスタンスを使用しています。おそらく、これは混乱を引き起こします。また、それがおそらく +appearanceWhenContainedIn: が期待どおりに機能しない理由です。

アプリケーション全体でナビゲーション バーの背景画像を設定するには、+appearance を使用する必要があります。ナビゲーション コントローラーで単一のナビゲーション バーの背景画像を設定するには、UINavigationBar の -setBackgroundImagE:forBarMetrics: を使用します。

コード: -TranslucentViewController viewWillAppear: で背景画像とバーのスタイルを設定します。RootViewController で、背景画像とバーのスタイルを再設定します。私の経験では、-in viewWillDisappear: の代わりに -viewWillAppear: でナビゲーション バーを変更するのが最善です (または、元に戻すものを追跡する必要があります)。

RootViewController で

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [self.navigationController.navigationBar setBarStyle:UIBarStyleDefault];
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"orangeNavigationBar.png"] forBarMetrics:UIBarMetricsDefault];
}

TranslucentViewController で

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];

    [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
    [self.navigationController.navigationBar setBarStyle:UIBarStyleBlackTranslucent];
}

あ、あと:こういうところだけ変えてください。ビューコントローラーなどを押すときではありません。

于 2012-09-18T10:35:00.420 に答える
0

タブバーを使用するかどうかに応じて、appDelegateをナビゲーションバーのデリゲートまたはサブクラスUINavigationControllerとして指定できるため、コードはviewControllerスタックへのすべての変更を認識します。次に、UINavigationBarのプロパティを設定して、表示されているviewControllerのクラスに応じて透明または非透明にします。

于 2012-08-27T13:53:05.887 に答える