AGGIORNAMENTO iOS 7.1 : sembra che la soluzione alternativa per la modifica del canale alfa in UINavigationBar sia stata ignorata in questo aggiornamento. In questo momento, la soluzione migliore sembra essere quella di "affrontarlo" e sperare che qualunque colore scegliate possa rendere un effetto traslucido. Sto ancora cercando modi per aggirare questo.
AGGIORNAMENTO di iOS 7.0.3 : la libreria GitHub che abbiamo creato è stata aggiornata per aggirare leggermente questo problema quando si utilizza iOS 7.0.3. Sfortunatamente, non esiste una formula magica per supportare entrambi i colori creati in iOS 7.0.2 e precedenti e iOS 7.0.3. Sembra che Apple abbia migliorato la saturazione, ma a costo dell'opacità (poiché la traslucenza sfocata dipende dal livello di opacità). Io, insieme ad alcuni altri, sto lavorando per creare una soluzione molto migliore per questo.
Sono sicuro che molte persone hanno già riscontrato il problema in cui iOS 7 tende a desaturare il colore di una UINavigationBar che è traslucida.
Il mio obiettivo è quello di ottenere un UINavigationBar con questo colore di tinta, ma traslucido:
Tuttavia, con traslucenza, sto ottenendo questo. La vista di sfondo è bianca, che capisco renderà questa vista un po 'più chiara:
Esiste un modo per ottenere il colore originale pur avendo la traslucenza? Ho notato che Facebook è stato in grado di far diventare la loro barra il loro ricco colore blu, come mostrato qui:
.. so che deve esserci un modo. Le viste di sfondo ovviamente fanno la differenza qui, ma la maggior parte del loro contenuto è anche grigio / bianco. Sembra che, indipendentemente dal colore della tinta della barra che inserisci, non puoi ottenere colori vivaci sotto la traslucenza.
Aggiornato con soluzione.
Ecco la soluzione che mi è venuta in mente. Ho preso la soluzione di Aprato e poi ho incluso l'abitudine UINavigationBar
in una UINavigationController
sottoclasse. Ho creato un repository che ha questa implementazione elencata di seguito, insieme a un'app di esempio .
////////////////////////////
// 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
meglio possibile quando esposto alla traslucenza in iOS 7.
UINAvigationBar
opaco?