IOS 7で半透明のナビゲーションバーに適切な色を付けるにはどうすればよいですか?ナビゲーションバーは、指定された色をより明るい色に調整するだけです。色の明るさや彩度を変更しても、正しい結果が得られません。
同じトラブルを抱えている人はいますか? Facebookを見ると、どういうわけか機能しているようです。彼らは色と半透明のナビゲーションバーを持っています。
編集:明確にするために:バーは半透明で、透明ではなく(アルファ付き)、固体ではない必要があります! http://en.wikipedia.org/wiki/Transparency_and_translucency
編集:Apple BugReporterに投稿されました
バーは色の値を調整します。
RGB> = 40の場合にのみ推奨される方法は、最もぼやける
この計算機を使用して、画面にレンダリングするときに色を設定することができます。barTintColorの色を設定する方法がわかります。Appleで調整すると、意図したとおりに表示されます
http://b2cloud.com.au/how-to-guides/bar-color-calculator-for-ios7-and-ios8/
編集:これらの計算は白い背景と明るい色のためのものであることに注意してください(40以上のRGB、暗い必要がある場合は、他の人が言及したように背景レイヤーを追加する必要があります-それはバーのぼかしを軽減しますが)
代替の暗いアンダーレイビュー、Facebookの濃い青色の例:(65,96,156)http://img707.imageshack .us/img707/3151/482w.png
詳細なガイド: http://b2cloud.com.au/how-to-guides/custom-uinavigationbar-colors-in-ios7
スニペット:
@interface UnderlayNavigationBar : UINavigationBar
@end
。
@interface UnderlayNavigationBar ()
{
UIView* _underlayView;
}
- (UIView*) underlayView;
@end
@implementation UnderlayNavigationBar
- (void) didAddSubview:(UIView *)subview
{
[super didAddSubview:subview];
if(subview != _underlayView)
{
UIView* underlayView = self.underlayView;
[underlayView removeFromSuperview];
[self insertSubview:underlayView atIndex:1];
}
}
- (UIView*) underlayView
{
if(_underlayView == nil)
{
const CGFloat statusBarHeight = 20; // Make this dynamic in your own code...
const CGSize selfSize = self.frame.size;
_underlayView = [[UIView alloc] initWithFrame:CGRectMake(0, -statusBarHeight, selfSize.width, selfSize.height + statusBarHeight)];
[_underlayView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
[_underlayView setBackgroundColor:[UIColor colorWithRed:0.0f green:0.34f blue:0.62f alpha:1.0f]];
[_underlayView setAlpha:0.36f];
[_underlayView setUserInteractionEnabled:NO];
}
return _underlayView;
}
@end
。
UIViewController* rootViewController = ...;
UINavigationController* navigationController = [[UINavigationController alloc] initWithNavigationBarClass:[UnderlayNavigationBar class] toolbarClass:nil];
[navigationController.navigationBar setBarTintColor:[UIColor colorWithRed:0.0f green:0.0f blue:90.0f/255.0f alpha:1]];
[navigationController setViewControllers:@[rootViewController]];
translucent
プロパティを変更するだけです
navigationBar.translucent = NO;
これは、ナビゲーションバーの透明なサブビュー/サブレイヤーの削除/作成と実質的に同じです。
からのコードを改善しましたフォークのiOS 7半透明UINavigationBar の明るく鮮やかな色を実現: https: //github.com/allenhsu/CRNavigationController
変更すると、画面上の結果の色(白い背景で選択)はsetBarTintColorに渡される値とまったく同じになります。それは素晴らしい解決策だと思います。
この単純なbarTintColor Calculatorを使用するだけです。
色が非常に鮮やかでない場合は、アルファ付きの同等の色を計算できます。これはiOS 7.0.3以降でうまく機能します。 7.0.3より前は、自動的に0.5アルファが適用されていました。
このコードは、入力色がRGBで不透明であり、背景色が白であることを前提としています。
- (UIColor *) colorByInterpolatingForBarTintWithMinimumAlpha: (CGFloat) alpha
{
NSAssert(self.canProvideRGBComponents, @"Self must be a RGB color to use arithmatic operations");
NSAssert(self.alpha == 1, @"Self must be an opaque RGB color");
CGFloat r, g, b, a;
if (![self getRed:&r green:&g blue:&b alpha:&a]) return nil;
CGFloat r2,g2,b2,a2;
r2 = g2 = b2 = a2 = 1;
CGFloat red,green,blue;
alpha -= 0.01;
do {
alpha += 0.01;
red = (r - r2 + r2 * alpha) / alpha;
green = (g - g2 + g2 * alpha) / alpha;
blue = (b - b2 + b2 * alpha) / alpha;
} while (alpha < 1 && (red < 0 || green < 0 || blue < 0 || red > 1 || green > 1 || blue > 1));
UIColor *new = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
return new;
}
誰かがアルファを計算するよりエレガントな方法を持っているなら(私はそのdo-whileループにうんざりしています)私はそれを見たいです: https://Gist.github.com/sgtsquiggs/7206385 =
IOS 7.x以降で半透明のナビゲーションバーの色を正しくする別の方法を次に示します。一部の色では、半透明のバーが目的の色に一致する色で表示されるようにする最適なバーの色合いを見つけることができます。
たとえば、rgb: 65,96,156
または#41609c
のFacebookカラーの場合、最適な色は#21458c
です。次のコードは、アプリ内のすべてのナビゲーションバーを、ネイティブのcocoa-touch APIのみでFacebookカラーに設定します。
UIColor* barColor = [UIColor colorWithRed:0.129995 green:0.273324 blue:0.549711 alpha:1.0]; // #21458c to make bars actual color match the #41609c color.
[[UINavigationBar appearance] setBarTintColor:barColor];
この方法の唯一の制限は、すべての可能な色に対して最適化された色が見つからないことです。通常、これは暗い色では不可能です。
BarTintColorOptimizer ユーティリティを作成しました。このユーティリティをデバイスで実行して、入力した色の最適化されたバーの色を検索します。
上記のコメントをすべて読んだと思います。カスタムの背景と半透明性を取得する場合は、navigationbarクラスをオーバーライドし、独自のlayoutsubviewsメソッドを実装する必要があります。ここにサブビューを追加するだけです。重要:NavigationBarの背景サブビューのすぐ上に追加する必要があります。すべてのサブビューの上に配置すると、ヘッダーまたはボタンが非表示になります。
また、チェックアウト この質問
私は周りをよく見てきましたが、これらのどれも実際にはうまくいきませんでした、解決策は次のとおりです:
1-ナビゲーションを設定しますbarTintColor(背景)。
2-シミュレータを実行してアプリを開き、Macを開いてDigital Color Meterを選択し、ドロップダウンから「Generic RGBで表示」を選択します。
3-このツールを使用して、ビューに設定するナビゲーションの色を選択します。
4-ストーリーボードに移動して、背景色を選択し、RGBスライダーでその色を確認し、ここに色を入力すると、ナビゲーションバーとまったく同じ色になります。
注:isTranslucentがオンかオフかは関係ありません。
これがお役に立てば幸いです。
濃淡の色を暗くするために、ナビゲーションバーのbackgroundColorを変更できます。
UIColor *color1 = [UIColor colorWithRed:55.0f/256.0f green:0.0f blue:1.0f alpha:1.0f];
[navBar setBarStyle:UIBarStyleBlackTranslucent];
[navBar setBarTintColor:color1];
UIColor *color2 = [UIColor colorWithWhite:0 alpha:0.3];
[navBar setBackgroundColor:color2];
Color1とcolor2を試して、自分に合った結果を達成してください。他のものはフレームワークと戦っています。
Swift 2.0を使用している場合、これを使用できます。これにより、ぼかしが削除され、色が適切に表示されます。
UINavigationBar.appearance().translucent = false
UINavigationControllerを拡張しました。
viewDidLoadに、同じ色合いの背景を追加しました。
また、ステータスバー領域を覆うように背景フレームを設定しました。
self.navigationBar.barTintColor = navBackgroundColor;
CGRect bgFrame = self.navigationBar.bounds;
bgFrame.Origin.y -= 20.0;
bgFrame.size.height += 20.0;
UIView *backgroundView = [[UIView alloc] initWithFrame:bgFrame];
backgroundView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
backgroundView.backgroundColor = navBackgroundColor;
backgroundView.alpha = 0.6;
[self.navigationBar addSubview:backgroundView];
[self.navigationBar sendSubviewToBack:backgroundView];
私の場合、alpha 0.6で作業は完了しましたが、それで遊ぶことができます。
前と後の色を比較すると、色相と明るさは同じままですが、彩度が21%低下しています。
21%を追加し直すことで、カラーマッチングを大幅に改善することができました。残念なことに、最初から80を超える彩度があったため、100%を超えるとリターンが減少し、完全には一致しませんでしたが、かなり近くなりました。
彩度が80未満の色の場合は、さらに改善されるはずです。
色の彩度を調整する方法については IColorの色相、明るさ、彩度を変更するにはどうすればよいですか?
navBar.barTintColor = [UIColor orangeColor];
navBar.translucent = YES;
UIColor *backgroundLayerColor = [[UIColor redColor] colorWithAlphaComponent:0.7f];
static CGFloat kStatusBarHeight = 20;
CALayer *navBackgroundLayer = [CALayer layer];
navBackgroundLayer.backgroundColor = [backgroundLayerColor CGColor];
navBackgroundLayer.frame = CGRectMake(0, -kStatusBarHeight, navBar.frame.size.width,
kStatusBarHeight + navBar.frame.size.height);
[navBar.layer addSublayer:navBackgroundLayer];
// move the layer behind the navBar
navBackgroundLayer.zPosition = -1;
必要な正確な色を得るには、barTintColorとbackgroundLayerColorをいじる必要があることに注意してください。また、もちろん、色はコンテンツビューの背景色(たとえば、白)に依存します。