Пользовательский фон для проблем UINavigationBar - PullRequest
2 голосов
/ 16 сентября 2009

Мне удалось добавить пользовательский фон на панель навигации с помощью:

UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"UINavigationBar.png"]];
[myViewController.navigationBar insertSubview:iv atIndex:0];
[iv release];

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

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

Есть идеи?

Спасибо

Mike

Ответы [ 5 ]

12 голосов
/ 16 сентября 2009

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

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    // Drawing code 
    UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);

}
@end
1 голос
/ 10 декабря 2011

Подвиды NavigationBar постоянно меняются, я имею в виду, что каждое представление появляется / исчезает, поэтому не следует ожидать, что добавленное изображение будет отображаться в индексе 0 массива subviews.

Вы можете попытаться добавить это в viewDidAppear (в каждом контроллере представления, который управляет элементами навигации /:):

NSLog(@"navbar's subviews before \n %@",[[[self navigationController] navigationBar] subviews]);

for (UIImageView *imgv in [[[self navigationController] navigationBar] subviews]) {
    [[[self navigationController] navigationBar] sendSubviewToBack:imgv];
}

NSLog(@"navbar's subviews after \n %@",[[[self navigationController] navigationBar] subviews]);

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

Надеюсь, это поможет, по крайней мере, понять, почему то, что вы делали, не работало,

1 голос
/ 20 октября 2011

В iOS 5 это не будет работать, но хорошая новость в том, что есть простой способ сделать это

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"name"] forBarMetrics:UIBarMetricsDefault];

ПРИМЕЧАНИЕ. Это будет работать только на iOS 5 и выше, поэтому обязательно проверьте версию iOS, если хотите иметь обратную совместимость.

0 голосов
/ 22 февраля 2012

Способ, которым вы можете просто добавить новый фон к вашему UINavigationBar, следующий.

/////////
 UINavigationController *navController = [[UINavigationController alloc] init];
 UINavigationBar*bar=[navController navigationBar]; // get navigation bar 
  NSArray*barSubview=[bar subviews]; // get all subviews of bar
 UIView*backView=[arr objectAtIndex:0]; // at index 0 lying background view of our bar
 backView.alpha=0.0f;// set alpha to 0 and it will become invisible

    UIImageView*imgView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"top-bar.png"]];// create the image view that we will insers as subbview in our bar
    imgView.frame=CGRectMake(0, 0, 320, 44);
    [bar insertSubview:imgView atIndex:0];// and it will be out new background
    [imgView release];
0 голосов
/ 13 февраля 2011

Вместо того, чтобы делать это в drawRect: , вы можете переопределить метод drawLayer: inContext: в классе категории UINavigationBar. Внутри метода drawLayer: inContext: вы можете нарисовать фоновое изображение, которое хотите использовать. Также вы можете выбрать разные изображения для книжной и альбомной ориентации интерфейса, если ваше приложение поддерживает несколько ориентаций интерфейса.

- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
    if ([self isMemberOfClass:[UINavigationBar class]] == NO) {
        return;
    }

    UIImage *image = (self.frame.size.width > 320) ?
                        [UINavigationBar bgImageLandscape] : [UINavigationBar bgImagePortrait];
    CGContextClip(context);
    CGContextTranslateCTM(context, 0, image.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
}

Этот полный демонстрационный проект Xcode по настройке внешнего вида UINavigationBar также может быть полезен.

...