#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
на своей панели навигации.
Спасибо за вашу помощь.