AKTUALIZACJA iOS 7.1 : Wygląda na to, że obejście zmiany kanału alfa na pasku UINavigationBar zostało zignorowane w tej aktualizacji. W tej chwili najlepszym rozwiązaniem wydaje się po prostu „uporać się z tym” i mieć nadzieję, że wybrany kolor da efekt półprzezroczystości. Nadal szukam sposobów obejścia tego.
AKTUALIZACJA iOS 7.0.3 : Biblioteka GitHub, którą utworzyliśmy , została zaktualizowana, aby nieco obejść ten problem podczas korzystania z systemu iOS 7.0.3. Niestety nie ma magicznej formuły obsługującej oba kolory stworzone w iOS 7.0.2 i wcześniejszych oraz iOS 7.0.3. Wygląda na to, że Apple poprawiło nasycenie, ale kosztem krycia (ponieważ rozmyta przezroczystość zależy od poziomu krycia). Wraz z kilkoma innymi pracujemy nad stworzeniem znacznie lepszego rozwiązania tego problemu.
Jestem pewien, że wiele osób już spotkało się z problemem, w którym iOS 7 ma tendencję do desaturacji koloru paska UINavigationBar, który jest półprzezroczysty.
Moim celem jest osiągnięcie UINavigationBar z tym odcieniem koloru, ale półprzezroczystym:
Jednak dzięki przezroczystości dostaję to. Widok tła jest biały, co, jak rozumiem, sprawi, że ten widok będzie nieco jaśniejszy:
Czy istnieje sposób na uzyskanie oryginalnego koloru przy zachowaniu przezierności? Zauważyłem, że Facebookowi udało się uzyskać ich pasek, aby był ich bogatym, niebieskim kolorem, jak pokazano tutaj:
.. więc wiem, że musi być jakiś sposób. Widoki w tle oczywiście mają tutaj znaczenie, ale większość ich treści jest również szaro-biała. Wygląda na to, że niezależnie od zastosowanego odcienia paska, pod przezroczystością nie można uzyskać żywych kolorów.
Zaktualizowany rozwiązaniem.
Oto rozwiązanie, które wymyśliłem. Wziąłem aprato rozwiązanie „s, a następnie objęła zwyczaj UINavigationBar
obrębie UINavigationController
podklasy. Utworzyłem repozytorium, które ma tę implementację wymienioną poniżej, wraz z przykładową aplikacją .
////////////////////////////
// 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
jak najlepiej po wystawieniu na półprzezroczystość w iOS 7.
UINAvigationBar
nieprzezroczysty?