UINavigationItem leftBarButton скрыт за своим фоном

#cocoa-touch #uinavigationcontroller #uinavigationbar #uinavigationitem

#cocoa-touch #uinavigationcontroller #панель uinavigationbar #элемент uinavigationitem

Вопрос:

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

 //custom background
UIImageView *background = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"navigation-bar.png"]] autorelease];
[self.navigationController.navigationBar insertSubview:background atIndex:0];

//custom back button
UIImage *buttonImage = [UIImage imageNamed:@"btn_back.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:buttonImage forState:UIControlStateNormal];
button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height);
[button addTarget:self action:@selector(backPressed:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];
self.navigationItem.leftBarButtonItem = customBarItem;
[customBarItem release];
  

Кнопка «Назад» всегда работает, но ее можно увидеть, только если я не применяю свой пользовательский фон. Не мог бы кто-нибудь, пожалуйста, указать, как достичь обоих?

Заранее спасибо. Рики.

Ответ №1:

Вы можете установить фоновое изображение панели навигации, используя это

 @implementation UINavigationBar (UINavigationBarCategory)

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
{
    if([self isMemberOfClass:[UINavigationBar class]])
    {
        UIImage *image;


        image=[UIImage imageNamed:@"nav_bar_img"];


        CGContextClip(ctx);
        CGContextTranslateCTM(ctx, 0, image.size.height);
        CGContextScaleCTM(ctx, 1.0, -1.0);
        CGContextDrawImage(ctx,
                           CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage); 
    }
    else 
    {        
        [super drawLayer:layer inContext:ctx];     
    }
}  
@end
  

Комментарии:

1. Спасибо, саадниб, но что произойдет, если я захочу изменить фон во всем моем приложении?

2. Извините, я имел в виду ситуацию, когда я хочу, чтобы фон панели навигации менялся на разные изображения по всему приложению?

Ответ №2:

В итоге я сделал следующее.

 @implementation UINavigationBar (Category)

- (void)drawRect:(CGRect)rect
{
    MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
    [delegate.navImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

@end
  

Каждый раз, когда я хочу изменить фон панели, я изменяю свойство navImage делегата и вызываю -setNeedsDisplay на своей панели навигации.

Спасибо за вашу помощь.