Оновлення 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
непрозорий?