IOS 7.1 UPDATE : 看起来修改 UINavigationBar 中 alpha 通道的解决方案在这次更新中被忽略了。现在,最好的解决办法似乎就是“处理它”,并希望无论你选择什么颜色都能呈现出半透明的效果。我还在想办法解决这个问题。
IOS7.0.3更新 : 在使用 iOS7.0.3时,我们创建的 GitHub 库已经进行了更新,略微解决了这个问题。不幸的是,没有一个神奇的公式能同时支持 iOS7.0.2及更早版本和 iOS7.0.3中创建的两种颜色。看起来苹果提高了饱和度,但是以不透明度为代价(因为模糊的半透明度取决于不透明度水平)。我和其他一些人正在努力为此创造一个更好的解决方案。
我相信很多人已经遇到过这样的问题: iOS7倾向于去饱和 UINavigationBar 的半透明颜色。
我的目标是实现一个 UINavigationBar,颜色是这样的,但是是半透明的:
然而,通过半透明,我得到了这个。背景图是白色的,我知道这会让这个图看起来更亮一些:
有没有办法在保持半透明的情况下达到原色?我已经注意到 Facebook 已经能够让他们的酒吧成为他们丰富的蓝色,如下图所示:
..所以我知道一定有办法。背景视图在这里显然有所不同,但是它们的大部分内容也是灰色/白色的。似乎无论你加入什么条形色彩,你都无法在半透明状态下获得生动的色彩。
更新了解决方案。
这是我最后想到的解决办法。我采用了 慢慢来的解决方案,然后在 UINavigationController
子类中包含了定制的 UINavigationBar
。我已经创建了一个存储库,下面列出了这个实现以及一个示例应用程序.
////////////////////////////
// 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