iOS 7.1 UPDATE. Похоже, что обходной путь для изменения альфа-канала в UINavigationBar был проигнорирован в этом обновлении. Прямо сейчас лучшим решением является просто "справиться с этим" и надеяться, что любой цвет, который вы выберете, может сделать полупрозрачный эффект. Я все еще ищу способы обойти это.
iOS 7.0.3 UPDATE: Библиотека 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