Получите правильный цвет в прозрачной панели навигации iOS7


Как я могу получить правильную раскраску для моих полупрозрачных навигационных панелей в iOS 7? Панель навигации просто настраивает данный цвет на гораздо более яркий. Изменение яркости или насыщенности цвета также не дает правильного результата.

У кого-нибудь такие же проблемы? Кажется, это как-то работает, глядя на Facebook: у них есть свои цвета и полупрозрачные навигационные панели.

Edit: просто чтобы было понятно: мне нужно, чтобы бар был полупрозрачным, а не прозрачный (с некоторой Альфой), не твердый! http://en.wikipedia.org/wiki/Transparency_and_translucency

Edit: теперь опубликовано в Apple BugReporter

19 70

19 ответов:

бар будет регулировать ваши значения цвета.

предпочтительный метод, только для RGB >= 40, даст наибольшее размытие

вы можете использовать этот калькулятор и положить в то, что вы хотите, чтобы цвет был при визуализации на экране, он скажет вам, что установить цвет barTintColor поэтому, когда Apple регулирует его, он будет отображаться как предназначенный

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

Edit: обратите внимание, что эти вычисления предназначены для белого фона и для более светлых цветов (rgb более 40, Если вам нужно темнее, вам нужно будет добавить фоновый слой, как упоминали другие , хотя это уменьшит размытие полосы)

альтернативный темный вид подложки, например, с темно-синим цветом Facebook: (65,96,156) http://img707.imageshack.us/img707/3151/482w.png

руководство по глубине:http://b2cloud.com.au/how-to-guides/custom-uinavigationbar-colors-in-ios7

фрагмент:

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

вам просто нужно изменить translucent свойства

navigationBar.translucent = NO;

это фактически то же самое, что удаление/создание прозрачных подвидов/подслоев панели навигации.

я улучшил код достижение ярких, ярких цветов для iOS 7 полупрозрачный UINavigationBar в моей вилке:https://github.com/allenhsu/CRNavigationController

с моей модификацией цвет результата на экране (выбранный на белом фоне) будет точно таким же значением, переданным в setBarTintColor. Я думаю, что это удивительное решение.

Я знаю, что этот ответ немного запоздал, но если вы используете Interface Builder, вы можете получить неправильный цвет при использовании шестнадцатеричного значения, потому что Interface Builder настроен на использование неправильного цветового пространства. В Xcode 6.4, вы можете нажать на небольшую шестерню в правом верхнем углу диалог выбора цвета, чтобы выбрать, какое цветовое пространство вы используете:

enter image description here

мой был установлен в sRGB IEC6196-2.1, когда я на самом деле должен был использовать общий RGB.

Если ваш цвет не является исключительно ярким, вы можете рассчитать эквивалентный цвет w/ alpha. Это хорошо работает в iOS 7.0.3+; до 7.0.3 он автоматически применял 0.5 alpha.

этот код предполагает, что ваш входной цвет RGB и непрозрачен, и что ваш цвет фона белый:

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

Если у кого-то есть более элегантный способ вычисления Альфа (я сжимаюсь в этом цикле do-while), я бы хотел его увидеть: https://gist.github.com/sgtsquiggs/7206385

Я полагаю, вы прочитали все комментарии выше. Если вы хотите получить пользовательский фон и прозрачность, вы должны переопределить класс navigationbar и реализовать свой собственный метод layoutsubviews. Просто добавьте дополнительный подвида здесь. Важно: вы должны добавить его чуть выше фонового подвида панели навигации. Он скроет ваш заголовок или кнопки, если вы просто поместите его над всеми подвидами.

кроме того, проверьте этот вопрос

просто используйте этот простой калькулятор barTintColor:

http://htmlpreview.github.io/?https://github.com/tparry/Miscellaneous/blob/master/UINavigationBar_UIColor_calculator.html

enter image description here

вот еще один способ получить правильный цвет полупрозрачной панели навигации в iOS 7.х и позже. Для некоторых цветов можно найти оптимальный цвет оттенка полосы,который делает полупрозрачный бар, чтобы появиться с цветом, который соответствует желаемому.

например, для Facebook цвет, который является rgb: 65,96,156 или #41609c оптимальный цвет #21458c. Следующий код устанавливает все навигационные панели в приложении, чтобы быть цвета Facebook с родной cocoa-touch API только:

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

в единственным ограничением метода является то, что оптимизированные цвет не может быть найден для каждого возможного цвета. Обычно это невозможно для темных цветов.

Я BarTintColorOptimizer утилита, которая должна быть запущена на устройстве для поиска оптимизированного цвета панели для любого цвета, который вы вводите.

простое/быстрое решение, которое работает для меня. Просто установите оттенок бара в раскадровке, а не на заднем плане.

Сначала выберите Панель навигации в навигационном контроллере
Navigation Bar

а затем щелкните инспектор атрибутов справа, а затем установите оттенок панели
Bar tint

вы можете выбрать заранее определенный цвет или нажать на цвет, чтобы установить его на что-то другое.
enter image description here

чтобы оттенок цвета выглядел темнее, вы можете изменить фоновый цвет панели навигации:

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

попробуйте поиграть с color1 и color2, чтобы достичь результата, который подходит вам. Все остальное было бы борьбой с рамками.

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;

Примечание вам все равно нужно будет гадить с barTintColor и backgroundLayerColor, чтобы получить точный цвет, который вы хотите. Кроме того, конечно, цвета зависят от цвета фона вашего представления контента (например, белый).

я расширил UINavigationController,
на его viewDidLoad, я добавил фон с тем же цветом оттенка.

кроме того, я установил фоновую рамку для покрытия области строки состояния:

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

на мой случай Альфа 0.6 получил работу, но вы можете играть с ним.

Если вы используете swift 2.0, вы можете использовать это, это удалит размытие и правильно отобразит цвет.

UINavigationBar.appearance().translucent = false

от сравнения моего до того, как после цветов я обнаружил, что было падение 21% в насыщенности в то время как оттенок и яркость остались прежними.

добавив 21% обратно, я смог значительно улучшить соответствие цветов. К сожалению, наш цвет имел насыщенность выше 80, чтобы начать с того, чтобы толкать его выше 100% , имел уменьшающуюся отдачу и не соответствовал идеально, но он стал намного ближе.

для цветов с насыщенностью ниже 80 он должен сделать даже лучше.

для получения информации о том, как скорректировать насыщенность цвета как я могу изменить оттенок, яркость и насыщенность UIColor?

вы можете запустить приложение в симуляторе и принять цвет панели навигации с помощью инструмента "пипетка".

enter image description here

Это должно работать:

UIColor *barColour = [UIColor colorWithRed:0.13f green:0.14f blue:0.15f alpha:1.00f];

UIView *colourView = [[UIView alloc] initWithFrame:CGRectMake(0.f, -20.f, 320.f, 64.f)];
colourView.opaque = NO;
colourView.alpha = .7f;
colourView.backgroundColor = barColour;

self.navigationBar.barTintColor = barColour;

[self.navigationBar.layer insertSublayer:colourView.layer atIndex:1];

принято от здесь

это работает для меня:

CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(0, -20,navigationBar.frame.size.width,navigationBar.frame.size.height + 20);
layer.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent:0.75].CGColor;
layer.zPosition = -5;
[navigationBar.layer addSublayer:layer];

Это происходит потому, что панель навигации.полупрозрачный = = да. Установите это свойство в НЕТ, и это будет правильный цвет. Однако я не узнал, как применить эту полупрозрачную настройку ко всем навигационным панелям, не вызывая ее явно на каждой. Таким образом, строка состояния также остается того же цвета, что и панель навигации.

попробуйте отобразить соответствующее фоновое изображение для панели навигации. Это сработало для моего тестового приложения.

UIGraphicsBeginImageContext(CGSizeMake(1, 1));
CGContextRef context = UIGraphicsGetCurrentContext();
[[UIColor colorWithRed:55.0f/256.0f green:0.0f blue:1.0f alpha:0.5f] set];
CGContextFillRect(context, CGRectMake(0, 0, 1, 1));

UIImage *navBarBackgroundImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[[UINavigationBar appearance] setBackgroundImage:navBarBackgroundImage forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setBackgroundImage:navBarBackgroundImage forBarMetrics:UIBarMetricsLandscapePhone];