iOS 7.1のアップデート:UINavigationBarのアルファチャネルを変更するための回避策は、このアップデートでは無視されているようです。現在のところ、最善の解決策は、「それに対処する」ことであり、選択した色が半透明の効果をレンダリングできることを期待しているようです。私はまだこれを回避する方法を調べています。
iOS 7.0.3のアップデート:作成したGitHubライブラリは、iOS 7.0.3を使用するときにこの問題を少し回避するようにアップデートされました。残念ながら、iOS 7.0.2以前とiOS 7.0.3で作成された両方の色をサポートする魔法の公式はありません。Appleは彩度を改善したようですが、不透明度が犠牲になります(ぼやけた半透明度は不透明度レベルに依存するため)。私は、他の数人と一緒に、これに対するより良い修正の作成に取り組んでいます。
iOS 7が半透明のUINavigationBarの色の彩度を下げる傾向があるという問題にすでに多くの人が遭遇していると思います。
私の目標は、この色合いで半透明のUINavigationBarを実現することです。
しかし、半透明で、私はこれを得ています。背景ビューは白ですが、このビューは少し明るくなると思います。
半透明性を維持しながら元の色を実現する方法はありますか?ここに表示されているように、Facebookがバーを豊かな青色にできることに気づきました。
..だから何か方法があるはずだと知っています。ここで背景ビューは明らかに違いをもたらしますが、そのコンテンツのほとんどは灰色/白です。どんなバーティントカラーを入れても、半透明では鮮やかな色が出ないようです。
ソリューションで更新されました。
これが私が思いついた解決策です。私はapratoのソリューションを採用し、カスタムUINavigationBar
をUINavigationController
サブクラスに含めました。私は、以下のリストにある実装と、サンプルアプリを含むリポジトリを作成しました。
////////////////////////////
// CRNavigationBar.m
////////////////////////////
#import "CRNavigationBar.h"
@interface CRNavigationBar ()
@property (nonatomic, strong) CALayer *colorLayer;
@end
@implementation CRNavigationBar
static CGFloat const kDefaultColorLayerOpacity = 0.5f;
static CGFloat const kSpaceToCoverStatusBars = 20.0f;
- (void)setBarTintColor:(UIColor *)barTintColor {
[super setBarTintColor:barTintColor];
if (self.colorLayer == nil) {
self.colorLayer = [CALayer layer];
self.colorLayer.opacity = kDefaultColorLayerOpacity;
[self.layer addSublayer:self.colorLayer];
}
self.colorLayer.backgroundColor = barTintColor.CGColor;
}
- (void)layoutSubviews {
[super layoutSubviews];
if (self.colorLayer != nil) {
self.colorLayer.frame = CGRectMake(0, 0 - kSpaceToCoverStatusBars, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds) + kSpaceToCoverStatusBars);
[self.layer insertSublayer:self.colorLayer atIndex:1];
}
}
@end
////////////////////////////
// CRNavigationController.m
////////////////////////////
#import "CRNavigationController.h"
#import "CRNavigationBar.h"
@interface CRNavigationController ()
@end
@implementation CRNavigationController
- (id)init {
self = [super initWithNavigationBarClass:[CRNavigationBar class] toolbarClass:nil];
if(self) {
// Custom initialization here, if needed.
}
return self;
}
- (id)initWithRootViewController:(UIViewController *)rootViewController {
self = [super initWithNavigationBarClass:[CRNavigationBar class] toolbarClass:nil];
if(self) {
self.viewControllers = @[rootViewController];
}
return self;
}
@end
UINavigationBar
のiOS 7に半透明にさらされたときに可能な限り最良の
UINAvigationBar
不透明ではありませんか?