Вопрос

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

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

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

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

Есть какие-нибудь идеи?

Спасибо,

Майк

Это было полезно?

Решение

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

@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

Другие советы

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

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

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

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

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

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

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

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

Вместо того, чтобы делать это в Нарисовать правильно: вы можете переопределить Растягивающий текст:InContext: метод в классе категории UINavigationBar.Внутри Растягивающий текст: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 также может быть полезной.

Далее приведен способ, которым вы можете просто добавить новый фон к вашей панели 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];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top