Градиент слоя NavigationBar не работает хорошо - PullRequest
0 голосов
/ 24 января 2012

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

CGRect navFrame = self.navigationController.navigationBar.frame;
navFrame.origin.y = 0.0f;
[self.navigationController.navigationBar.layer insertSublayer:[AddGradient addGradientToNavigationBar:navFrame] atIndex:0];

код для addGradientToNavigationBar равен

+ (CAGradientLayer*)addGradientToNavigationBar:(CGRect)navRect {

    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = navRect;
    gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0] CGColor],
                   (id)[[XAppDelegate getColor] CGColor], nil];

    return gradient;
}

1 Ответ

3 голосов
/ 04 октября 2012

У меня такая же проблема.Я пытался добавить градиентный слой на панель навигации со стилем UIBarStyleBlackTranslucent для эффекта стекла.После поиска в Интернете и множества экспериментов я не нашел правильного решения этой проблемы.Наконец, я придумал следующую работу:

    CAGradientLayer *yourGradient = ...

// Нужны два дополнительных слоя для имитации стиля UIBarStyleBlackTranslucent

    CAGradientLayer *gradient = [CAGradientLayer layer];

    gradient.frame = CGRectMake(0, 0, 320, 44);


    NSMutableArray *cgColors = [[NSMutableArray alloc] init];

    [cgColors addObject:(id)[[UIColor colorWithRed:0.0
                                     green:0.0
                                      blue:0.0
                                     alpha:0.2] CGColor]];
    [cgColors addObject:(id)[[UIColor colorWithRed:0.0
                                     green:0.0
                                      blue:0.0
                                     alpha:0.6] CGColor]];
    [cgColors addObject:(id)[[UIColor colorWithRed:0.0
                                     green:0.0
                                      blue:0.0
                                     alpha:0.5] CGColor]];

    gradient.colors = cgColors;

    CALayer *layer = [CALayer layer];

    _layer.frame = CGRectMake(0, 22, 320, 22);

    _layer.backgroundColor =[[UIColor colorWithRed:0.0
                                             green:0.0
                                              blue:0.0
                                             alpha:0.2] CGColor];

// Это необходимо для кнопок панели навигации

    [rootController.navigationBar setBarStyle:UIBarStyleBlackTranslucent];

// Добавление слоев к первому подслою слоя панели навигации

    [[[rootController.navigationBar.layer sublayers] objectAtIndex:0] insertSublayer:yourGradient atIndex:0];

// После добавления слоя градиента стиль UIBarStyleBlackTranslucent исчезает

//с панели (но не с кнопок)

// Поэтому для имитации необходимо следующее

    [[[rootController.navigationBar.layer sublayers] objectAtIndex:0] insertSublayer:gradient atIndex:1];

    [[[rootController.navigationBar.layer sublayers] objectAtIndex:0] insertSublayer:layer atIndex:2];

Вы также можете добавить некоторые границы к своему слою, так как границы кажутсяисчезнуть.

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