UINavigationBar текстура фон - PullRequest
2 голосов
/ 30 марта 2012

Я посмотрел на SO, погуглил его, попробовал сам, и я просто не могу придумать способ нарисовать UINavigationBar с текстурой фона.

Прежде чем вы начнете указывать мне на переопределение drawRect , setBackgroundImage: forBarMetrics: или любой другой подобный метод, позвольте мне объяснить:

Я хочу нарисовать панель навигации с моей текстурой фона (образец прилагается) и при этом сохранить эффект полупрозрачного градиента, предоставляемый UINavigationBar. Из того, что я искал, похоже, что единственный способ сделать это - включить этот эффект в само изображение, но я бы предпочел использовать эффект UINavigationBar (динамически, как вы видите), или, если нет способа создать UIImageView, используйте Quartz, чтобы нарисуйте эффект и добавьте его в качестве подпредставления UINavigationBar.

Что ты думаешь? Есть ли способ нарисовать эффект в Photoshop?

Спасибо

enter image description here

Ответы [ 4 ]

2 голосов
/ 02 апреля 2012

Отвечая на мой собственный вопрос:

Кажется, что обычный способ действительно заключается в том, чтобы включить блестящий градиент на само изображение, но если мне удастся сделать это программно, нарисовав градиент с помощью CAGradientLayer.

Код, который я использовал:

    //Create a image view
    UIImageView *imgView = [[UIImageView alloc] initWithImage:image];    
    imgView.frame = navBar.bounds;
    imgView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth;

    //Create a gradient layer
    //Thanks to Kris Johnson's code
    //https://bitbucket.org/KristopherJohnson/gradientbuttons/src/tip/Classes/GradientButton.m    
    CAGradientLayer *shineLayer = [CAGradientLayer layer];
    shineLayer.frame = imgView.bounds;
    shineLayer.colors = [NSArray arrayWithObjects:
                         (id)[UIColor colorWithWhite:1.0f alpha:0.4f].CGColor,
                         (id)[UIColor colorWithWhite:1.0f alpha:0.2f].CGColor,
                         (id)[UIColor colorWithWhite:0.75f alpha:0.2f].CGColor,
                         (id)[UIColor colorWithWhite:0.4f alpha:0.2f].CGColor,
                         (id)[UIColor colorWithWhite:1.0f alpha:0.4f].CGColor,
                         nil];
    shineLayer.locations = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:0.0f],
                            [NSNumber numberWithFloat:0.5f],
                            [NSNumber numberWithFloat:0.5f],
                            [NSNumber numberWithFloat:0.8f],
                            [NSNumber numberWithFloat:1.0f],
                            nil];


    //Add the gradient layer to the imageView
    [imgView.layer insertSublayer:shineLayer atIndex:1];    

    //Add the imageview to the navbar
    [navBar insertSubview:imgView atIndex:1];
2 голосов
/ 30 марта 2012

Вы все еще можете попытаться вставить свое собственное подпредставление в правильный индекс UINavigationBar. Но этот код будет отличаться в каждой версии iOS. Также вы потеряете автоматическое изменение размера (при вращении). Но, вероятно, это будет самый простой способ для вас.

Лучше было бы нарисовать эффекты глянца / отражения непосредственно на изображении и использовать стандартные методы, которые вы уже упоминали. Пример: Глянцевые иконки iPhone с использованием базовой графики

0 голосов
/ 30 марта 2012

попробуйте это:

if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)])
{
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"your_navbar.png"] forBarMetrics:UIBarMetricsDefault];
}
else
{
    UIImageView *imageView = imageView = [[UIImageView alloc] initWithImage:
                     [UIImage imageNamed:@"your_navbar.png"]];
    [imageView setTag:1];
    [self.navigationController.navigationBar insertSubview:imageView atIndex:0];
    [imageView release];
}
0 голосов
/ 30 марта 2012

Попробуйте это:

   self.navigationBar.tintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"image.png"]];
...