wake-up-neo.com

Holen Sie sich die richtige Farbe in der transparenten iOS7-Navigationsleiste

Wie kann ich unter iOS 7 die richtige Farbe für meine durchscheinenden Navigationsleisten erhalten? Die Navigationsleiste passt nur die gegebene Farbe an eine viel hellere an. Das Ändern der Helligkeit oder Sättigung der Farbe liefert auch nicht das richtige Ergebnis.

Hat jemand das gleiche Problem? Bei Facebook scheint es irgendwie zu funktionieren: Sie haben ihre Farben und durchscheinende Navigationsleisten.

Edit: Nur um es klar zu machen: Ich brauche den Balken durchscheinend, nicht transparent (mit etwas Alpha), nicht solide! http://en.wikipedia.org/wiki/Transparency_and_translucency

Bearbeiten: Jetzt in Apple BugReporter veröffentlicht

70
stk

Der Balken passt Ihre Farbwerte an.

Bevorzugte Methode, nur für RGB> = 40, führt zu der größten Unschärfe

Sie können diesen Rechner verwenden und die Farbe angeben, die beim Rendern auf dem Bildschirm angezeigt werden soll. Er gibt an, welche Farbe die BarTintColor-Farbe einstellt. Wenn Apple sie anpasst, wird sie wie beabsichtigt angezeigt

http://b2cloud.com.au/how-to-guides/bar-color-calculator-for-ios7-and-ios8/

Bearbeiten: Beachten Sie, dass diese Berechnungen für einen weißen Hintergrund und für hellere Farben gelten (rgb über 40, wenn Sie dunkler werden müssen, müssen Sie eine Hintergrundebene hinzufügen, die von anderen bereits erwähnt wurde. Dies verringert jedoch die Unschärfe der Leiste).

Alternative dunkle Unterlay-Ansicht, Beispiel mit Facebooks dunkelblauer Farbe: (65,96,156)http://img707.imageshack.us/img707/3151/482w.png

Ausführliche Anleitung: http://b2cloud.com.au/how-to-guides/custom-uinavigationbar-colors-in-ios7

Ausschnitt:

@interface UnderlayNavigationBar : UINavigationBar

@end

.

@interface UnderlayNavigationBar ()
{
    UIView* _underlayView;
}

- (UIView*) underlayView;

@end

@implementation UnderlayNavigationBar

- (void) didAddSubview:(UIView *)subview
{
    [super didAddSubview:subview];

    if(subview != _underlayView)
    {
        UIView* underlayView = self.underlayView;
        [underlayView removeFromSuperview];
        [self insertSubview:underlayView atIndex:1];
    }
}

- (UIView*) underlayView
{
    if(_underlayView == nil)
    {
        const CGFloat statusBarHeight = 20;    //  Make this dynamic in your own code...
        const CGSize selfSize = self.frame.size;

        _underlayView = [[UIView alloc] initWithFrame:CGRectMake(0, -statusBarHeight, selfSize.width, selfSize.height + statusBarHeight)];
        [_underlayView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
        [_underlayView setBackgroundColor:[UIColor colorWithRed:0.0f green:0.34f blue:0.62f alpha:1.0f]];
        [_underlayView setAlpha:0.36f];
        [_underlayView setUserInteractionEnabled:NO];
    }

    return _underlayView;
}

@end

.

UIViewController* rootViewController = ...;
UINavigationController* navigationController = [[UINavigationController alloc] initWithNavigationBarClass:[UnderlayNavigationBar class] toolbarClass:nil];
[navigationController.navigationBar setBarTintColor:[UIColor colorWithRed:0.0f green:0.0f blue:90.0f/255.0f alpha:1]];
[navigationController setViewControllers:@[rootViewController]];
80
SomeGuy

Sie müssen lediglich die translucent-Eigenschaft ändern

navigationBar.translucent = NO;

Es ist im Grunde dasselbe wie das Entfernen/Erstellen transparenter Unteransichten/Unterebenen der Navigationsleiste.

14
malex

Ich habe den Code verbessert von Helle, lebendige Farben für eine durchscheinende UINavigationBar für iOS 7 in meiner Gabel: https://github.com/allenhsu/CRNavigationController

Bei meiner Änderung wird die Ergebnisfarbe auf dem Bildschirm (auf weißem Hintergrund ausgewählt) exakt der gleiche Wert in setBarTintColor sein. Ich finde es eine erstaunliche Lösung.

4
Allen Hsu

Ich weiß, dass diese Antwort etwas spät ist, aber wenn Sie Interface Builder verwenden, erhalten Sie möglicherweise die falsche Farbe, wenn Sie einen Hex-Wert verwenden, da Interface Builder den falschen Farbraum verwendet. In Xcode 6.4 können Sie auf das kleine Zahnrad oben rechts im Farbauswahldialog klicken, um den von Ihnen verwendeten Farbraum auszuwählen:

 enter image description here

Meine war auf sRGB IEC6196-2.1 eingestellt, als ich eigentlich Generic RGB hätte verwenden sollen.

3
Elethier
2
Damien Romito

Wenn Ihre Farbe nicht besonders lebhaft ist, können Sie die entsprechende Farbe mit Alpha berechnen. Dies funktioniert gut in iOS 7.0.3 und höher. vor 7.0.3 wurde automatisch eine 0.5 alpha angewendet.

In diesem Code wird davon ausgegangen, dass Ihre Eingabefarbe RGB ist und undurchsichtig ist und dass Ihre Hintergrundfarbe Weiß ist:

- (UIColor *) colorByInterpolatingForBarTintWithMinimumAlpha: (CGFloat) alpha
{
    NSAssert(self.canProvideRGBComponents, @"Self must be a RGB color to use arithmatic operations");
    NSAssert(self.alpha == 1, @"Self must be an opaque RGB color");

    CGFloat r, g, b, a;
    if (![self getRed:&r green:&g blue:&b alpha:&a]) return nil;

    CGFloat r2,g2,b2,a2;
    r2 = g2 = b2 = a2 = 1;

    CGFloat red,green,blue;

    alpha -= 0.01;
    do {
        alpha += 0.01;
        red = (r - r2 + r2 * alpha) / alpha;
        green = (g - g2 + g2 * alpha) / alpha;
        blue = (b - b2 + b2 * alpha) / alpha;
    } while (alpha < 1 && (red < 0 || green < 0 || blue < 0 || red > 1 || green > 1 || blue > 1));

    UIColor *new = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
    return new;
}

Wenn jemand eine elegantere Methode hat, das Alpha zu berechnen (ich krieche bei dieser Do-While-Schleife), würde ich es gerne sehen: https://Gist.github.com/sgtsquiggs/7206385

2

Einfache/schnelle Lösung, die für mich funktioniert hat.

Wählen Sie zunächst Ihre Navigationsleiste in Ihrem Navigationscontroller aus 
 Navigation Bar

Klicken Sie dann auf den Attributinspektor rechts und legen Sie den Balkentönung fest 
 Bar tint

Sie können eine vordefinierte Farbe auswählen oder auf die Farbe klicken, um eine andere Farbe festzulegen. 
 enter image description here

1
Markymark

Eine andere Möglichkeit, um die Farbe der durchscheinenden Navigationsleiste in iOS 7.x und höher zu erhalten. Bei einigen Farben ist es möglich, die optimale Farbtonfarbe für den Balken zu finden, durch die der durchscheinende Balken mit einer Farbe angezeigt wird, die der gewünschten entspricht.

Für Facebook-Farbe, die beispielsweise rgb: 65,96,156 oder #41609c ist, ist die optimale Farbe #21458c. Mit dem folgenden Code werden alle Navigationsleisten in der App so eingestellt, dass sie nur mit der natürlichen Cocoa-Touch-API Farbe von Facebook haben: 

UIColor* barColor = [UIColor colorWithRed:0.129995 green:0.273324 blue:0.549711 alpha:1.0]; // #21458c to make bars actual color match the #41609c color.
[[UINavigationBar appearance] setBarTintColor:barColor];

Die einzige Einschränkung der Methode besteht darin, dass die optimierte Farbe nicht für jede mögliche Farbe gefunden werden kann. Normalerweise ist dies für dunkle Farben nicht möglich. 

Ich habe ein BarTintColorOptimizer - Dienstprogramm erstellt, das auf dem Gerät ausgeführt werden sollte, um nach optimierter Balkenfarbe für jede eingegebene Farbe zu suchen.

1
IvanRublev

Ich nehme an, Sie haben alle obigen Kommentare gelesen. Wenn Sie den benutzerdefinierten Hintergrund und die Durchsichtigkeit erhalten möchten, sollten Sie die Navigationsleisten-Klasse überschreiben und Ihre eigene Layoutsubviews-Methode implementieren. Fügen Sie hier einfach weitere Unteransicht hinzu. WICHTIG: Sie sollten es direkt über der Hintergrund-Unteransicht der Navigationsleiste hinzufügen. Die Kopf- oder Schaltflächen werden ausgeblendet, wenn Sie sie einfach über alle Unteransichten setzen.

Check out diese Frage

1
gleb.kudr

ich habe mich viel umgesehen und keines davon hat tatsächlich für mich funktioniert, die Lösung ist wie folgt:

1- Stellen Sie Ihre Navigation ein barTintColor (Hintergrund).

2- Starten Sie den Simulator und öffnen Sie Ihre App. Öffnen Sie auf Ihrem Mac Digital Color Meter und wählen Sie die Dropdown-Liste "In generischem RGB anzeigen".

enter image description here

3- Verwenden Sie dieses Werkzeug, um die Navigationsfarbe auszuwählen, die Sie für Ihre Ansicht festlegen möchten.

4- Gehen Sie zum Storyboard, wählen Sie die Hintergrundfarbe aus und stellen Sie sicher, dass die RGB-Schieberegler aktiviert sind. Wenn Sie die Farbe hier eingeben, erhalten Sie genau dieselbe Farbe wie in der Navigationsleiste.

enter image description here

Hinweis: Es spielt keine Rolle, ob isTranslucent aktiviert oder deaktiviert ist.

Hoffe das hilft dir weiter.

0
AaoIi

Damit die Tönungsfarbe dunkler aussieht, können Sie die backgroundColor der Navigationsleiste ändern:

UIColor *color1 = [UIColor colorWithRed:55.0f/256.0f green:0.0f blue:1.0f alpha:1.0f];
[navBar setBarStyle:UIBarStyleBlackTranslucent];
[navBar setBarTintColor:color1];
UIColor *color2 = [UIColor colorWithWhite:0 alpha:0.3];
[navBar setBackgroundColor:color2];

Versuchen Sie, mit color1 und color2 herumzuspielen, um das Ergebnis zu erzielen, das zu Ihnen passt. Alles andere würde gegen den Rahmen kämpfen.

0
DisableR

Wenn Sie Swift 2.0 verwenden, können Sie dies verwenden. Dadurch wird die Unschärfe entfernt und die Farbe richtig dargestellt. 

UINavigationBar.appearance().translucent = false
0
icekomo

Ich habe UINavigationController erweitert,
Ich habe auf der viewDidLoad einen Hintergrund mit der gleichen Farbe wie der Farbton hinzugefügt.

Außerdem habe ich den Hintergrundrahmen so eingestellt, dass er den Statusleistenbereich abdeckt:

    self.navigationBar.barTintColor = navBackgroundColor;
    CGRect bgFrame = self.navigationBar.bounds;
    bgFrame.Origin.y -= 20.0;
    bgFrame.size.height += 20.0;
    UIView *backgroundView = [[UIView alloc] initWithFrame:bgFrame];
    backgroundView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    backgroundView.backgroundColor = navBackgroundColor;
    backgroundView.alpha = 0.6;
    [self.navigationBar addSubview:backgroundView];
    [self.navigationBar sendSubviewToBack:backgroundView];

In meinem Fall hat Alpha 0.6 die Arbeit erledigt, aber Sie können damit spielen.

0
avishic

Beim Vergleich meiner Vorher-Nachher-Farben fand ich einen Rückgang der Sättigung um 21%, während Farbton und Helligkeit gleich blieben.

Durch Hinzufügen der 21% konnte ich die Farbanpassung deutlich verbessern. Leider hatte unsere Farbe zu Beginn eine Sättigung von über 80, so dass das Ergebnis über 100% zu einem Rückgang der Erträge führte und nicht perfekt zusammenpasste, aber es kam viel näher.

Bei Farben mit einer Sättigung unter 80 sollte dies noch besser sein.

Informationen zum Anpassen der Farbsättigung Wie kann ich den Farbton, die Helligkeit und die Sättigung eines UIColors ändern?

0
SuperGuyAbe
navBar.barTintColor = [UIColor orangeColor];
navBar.translucent = YES;
UIColor *backgroundLayerColor = [[UIColor redColor] colorWithAlphaComponent:0.7f];
static CGFloat kStatusBarHeight = 20;

CALayer *navBackgroundLayer = [CALayer layer];
navBackgroundLayer.backgroundColor = [backgroundLayerColor CGColor];
navBackgroundLayer.frame = CGRectMake(0, -kStatusBarHeight, navBar.frame.size.width,
        kStatusBarHeight + navBar.frame.size.height);
[navBar.layer addSublayer:navBackgroundLayer];
// move the layer behind the navBar
navBackgroundLayer.zPosition = -1;

Beachten Sie, dass Sie immer noch die BarTintColor und die BackgroundLayerColor verwenden müssen, um die gewünschte Farbe zu erhalten. Natürlich hängen die Farben auch von der Hintergrundfarbe Ihrer Inhaltsansicht ab (z. B. Weiß).

0
bobics

Sie können die Anwendung im Simulator ausführen und die Farbe der Navigationsleiste mit dem Pipettenwerkzeug festlegen.

 enter image description here

0
Vladimir