アプリケーション全体でUINavigationBar Translucencyを無効にする方法はありますか?
[self.navigationController.navigationBar setTranslucent:NO]
は単一のコントローラーでこの問題を修正できますが、アプリケーションに多くのUINavigationBarsがあり、これはかなり退屈な解決策です。
私はもう試した [[UINavigationBar appearance] setTranslucent:NO]
、しかしその機能は驚くほどサポートされていません。その結果、Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** Illegal property type, c for appearance setter, _installAppearanceSwizzlesForSetter:'
持っていれば、アプリ全体でUINavigationBarsを設定して半透明を1つずつ無効にすることもできますが、この問題にはもっとエレガントな解決策が必要です...
スタックの最初のナビゲーションバーの半透明をfalse
[self.navigationController.navigationBar setTranslucent:NO]
に設定すると、そのスタックにプッシュされる次のすべてのNavigationViewControllerに反映されます。
このスタイリングをアプリ全体に適用する場合のSwiftソリューションです。
AppDelegate
クラスで、これをdidFinishLaunchingWithOptions
に追加します。
Swift 2:の場合
UINavigationBar.appearance().translucent = false
Swift 3:の場合
UINavigationBar.appearance().isTranslucent = false
appDelegate
didFinishLaunchingWithOptions
のこのコードを使用すると非常に簡単に見えます(iOS 8以降のバージョンで正常に動作します)
[[UINavigationBar appearance] setTranslucent:NO];
このプロパティで使用できる外観プロキシがないことについては正しいと思います。 UINavigationControllersまたはUINavigationBarオブジェクトを使用していますか? UINavigationBarsを使用している場合、サブクラス化して、半透明でないナビゲーションバーを作成できます。
ヘッダーファイル:
#import <UIKit/UIKit.h>
@interface ABCNonTranslucentNavBar : UINavigationBar
@end
実装ファイル:
#import "ABCNonTranslucentNavBar.h"
@implementation ABCNonTranslucentNavBar
- (void)drawRect:(CGRect)rect
{
[self setTranslucent:NO];
}
次に、UINavigationBarsをサブクラスに置き換えます。サブクラス化されたUINavigationControllerを使用して同様のことを行うこともできます。
まだこれと戦っている人のためにこれを追加します。
ただし、存在しないイメージを指定することでそれを欺くことができます。これにより、ツールバーを含むナビゲーションバーが不透明になります。
[[UIToolbar appearance] setBackgroundColor:[UIColor colorWithRed:219.0/255.0 green:67.0/255.0 blue:67.0/255.0 alpha:1.0]];
[[UIToolbar appearance] setBackgroundImage:[[UIImage alloc] init] forToolbarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
私はこれが古いことを知っていますが、これは誰かにとって便利かもしれません。
カテゴリを使用して、その中にプロパティ[translucent][1]
を設定できます*
@implementation UINavigationBar (MakeTranslucent)
-(void)willMoveToWindow:(UIWindow *)newWindow {
[super willMoveToWindow:newWindow];
self.translucent = NO;
}
@end
外観APIは、ナビゲーションバーの半透明のプロパティをサポートしていないと思います。しかし、このようにアプリ全体でこれを行うことができます。このコードを見てください-
ここでメニュー画面はルートビューコントローラーです。
MenuScreen *ms = [[MenuScreen alloc]initWithNibName:@"MenuScreen" bundle:nil];
UINavigationController *nv = [[UINavigationController alloc]initWithRootViewController:ms];
//This will set property for whole App.
[nv.navigationBar setTranslucent:NO];
self.window.rootViewController = nv ;
UIKitコードドキュメントからの抜粋を参照してください。
/*
New behavior on iOS 7.
Default is YES.
You may force an opaque background by setting the property to NO.
If the navigation bar has a custom background image, the default is inferred
from the alpha values of the image—YES if it has any pixel with alpha < 1.0
If you send setTranslucent:YES to a bar with an opaque custom background image
it will apply a system opacity less than 1.0 to the image.
If you send setTranslucent:NO to a bar with a translucent custom background image
it will provide an opaque background for the image using the bar's barTintColor if defined, or black
for UIBarStyleBlack or white for UIBarStyleDefault if barTintColor is nil.
*/
正しいSwift 4ソリューションは
UINavigationBar.appearance().isTranslucent = false
UINavigationBar.appearance().backgroundColor = .white