71 votes

Obtenir la bonne couleur dans iOS7 translucide barre de navigation

Comment puis-je obtenir le droit de coloriage pour mon translucide barres de navigation dans iOS 7? La barre de navigation juste ajuste la couleur donnée à un beaucoup plus brillant. Changer la luminosité ou de la saturation de la couleur n'est pas livrer le bon résultat.

Toute personne ayant le même problème? Il semble fonctionner d'une certaine manière, en regardant Facebook: theyre avoir leurs couleurs translucides et les barres de navigation.

Edit: Juste pour préciser: j'ai besoin de la Barre translucide et non transparent (avec quelques alpha), pas solide! http://en.wikipedia.org/wiki/Transparency_and_translucency

Edit: Maintenant affiché à Apple BugReporter

81voto

SomeGuy Points 1971

La barre d'ajuster vos valeurs de couleur.

La méthode préférée pour le RVB >= 40, donnera le plus de flou

Vous pouvez utiliser cette calculatrice et de mettre dans ce que vous voulez que la couleur soit lors du rendu à l'écran, il vous dira ce que pour définir la couleur de la barTintColor donc quand Apple ajuste, il s'affiche comme prévu

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

Edit: à Noter que ces calculs sont pour un fond blanc, et de couleur plus claire (rvb plus de 40 ans, si vous avez besoin de plus sombre, vous aurez besoin d'ajouter un calque d'arrière-plan, comme d'autres l'ont mentionné, bien qu'permettra de réduire la barre de flou)

Suppléant sombre sous-couche en vue, par exemple avec Facebook est couleur bleu foncé: (65,96,156) http://img707.imageshack.us/img707/3151/482w.png

Dans le guide de profondeur: http://b2cloud.com.au/how-to-guides/custom-uinavigationbar-colors-in-ios7

Extrait:

@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]];

13voto

malex Points 2992

Vous avez simplement besoin de changement translucent de la propriété

navigationBar.translucent = NO;

C'est effectivement la même chose que de supprimer ou de rendre transparentes les sous-vues/sous-couches de la barre de navigation.

4voto

Allen Hsu Points 888

J'ai amélioré le code de la Réalisation lumineux, des couleurs vives pour un iOS 7 translucide UINavigationBar dans ma fourchette: https://github.com/allenhsu/CRNavigationController

Avec ma modification, le résultat de la couleur à l'écran (prises sur fond blanc) sera exactement la même valeur passée en setBarTintColor. Je pense que c'est une solution étonnante.

2voto

Matthew Crenshaw Points 123

Si votre couleur n'est pas exceptionnellement vives, vous pouvez calculer l'équivalent de couleur w/ alpha. Cela fonctionne bien sous iOS 7.0.3+; avant 7.0.3 automatiquement appliqué 0,5 alpha.

Ce code suppose que votre couleur d'entrée est RVB et est opaque, et que la couleur de fond est blanc:

- (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;
}

Si quelqu'un a un moyen plus élégant de calcul de l'alpha (je suis terrés à l'-lors de la boucle), je serais ravi de le voir: https://gist.github.com/sgtsquiggs/7206385

1voto

gleb.kudr Points 898

Je suppose que vous avez lu tous les commentaires ci-dessus. Si vous voulez le personnaliser l'arrière-plan et la translucidité vous devez remplacer le navigationbar de la classe et de mettre en œuvre votre propre layoutsubviews méthode. Simple d'ajouter des sous-vue ici. IMPORTANT: vous devriez ajouter juste au-dessus de l'arrière-plan sous-vue de la NavigationBar. Il permet de masquer votre en-tête ou des boutons si vous venez de mettre au-dessus de l'ensemble des sous-vues.

Aussi, découvrez cette question

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X