ОБНОВЛЕНИЕ 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
непрозрачен?