web-dev-qa-db-ja.com

iOS 7:アプリ全体でUINavigationBarの半透明性を無効にする

アプリケーション全体で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つずつ無効にすることもできますが、この問題にはもっとエレガントな解決策が必要です...

54
MikeS

スタックの最初のナビゲーションバーの半透明をfalse[self.navigationController.navigationBar setTranslucent:NO]に設定すると、そのスタックにプッシュされる次のすべてのNavigationViewControllerに反映されます。

33
Roshan

このスタイリングをアプリ全体に適用する場合のSwiftソリューションです。

AppDelegateクラスで、これをdidFinishLaunchingWithOptionsに追加します。

Swift 2:の場合

UINavigationBar.appearance().translucent = false

Swift 3:の場合

UINavigationBar.appearance().isTranslucent = false
16
dan

appDelegatedidFinishLaunchingWithOptionsのこのコードを使用すると非常に簡単に見えます(iOS 8以降のバージョンで正常に動作します)

[[UINavigationBar appearance] setTranslucent:NO];
7
Sudhin Davis

このプロパティで使用できる外観プロキシがないことについては正しいと思います。 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を使用して同様のことを行うこともできます。

3
Kyle Clegg

まだこれと戦っている人のためにこれを追加します。

ただし、存在しないイメージを指定することでそれを欺くことができます。これにより、ツールバーを含むナビゲーションバーが不透明になります。

[[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];
3
JulianB

私はこれが古いことを知っていますが、これは誰かにとって便利かもしれません。

カテゴリを使用して、その中にプロパティ[translucent][1]を設定できます*

@implementation UINavigationBar (MakeTranslucent)

-(void)willMoveToWindow:(UIWindow *)newWindow {
    [super willMoveToWindow:newWindow];


    self.translucent = NO;
}
@end
  • WillMoveToWindowを使用しましたが、これが良いアイデアかどうかわかりません。
2
BDR

外観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 ;
0
kshitij godara

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
0
fewlinesofcode