РЕДАКТИРОВАТЬ 2:
Я сейчас исправил эту проблему. Я настраивал пользовательское фоновое изображение для моего UINavigationBar следующим образом:
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 44.0)];
[imgView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"NavigationBarBackground" ofType:@"png"]]];
[navBar addSubview:imgView];
[navBar sendSubviewToBack:imgView];
[imgView release];
Это было бы хорошо для первого контроллера представления в стеке контроллера представления UINavigationController, но любые вспомогательные представления заставляли этот код перезапускаться и помещать пользовательский фон вперед.
Исправление:
Просто удалите весь свой код для пользовательского фона на контроллере навигации, затем РАСШИРИТЕ класс UINavigationBar следующим образом:
Создайте новый файл .h / .m с именем UINavigationBar + CustomImage. Установите код .h на:
@interface UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect;
@end
И .m до:
#import "UINavigationBar+CustomImage.h"
@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect {
UIImage *image = [UIImage imageNamed: @"NavigationBarBackground.png"];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end
И вуаля! Теперь все отлично работает.
--- КОНЕЦ РЕДАКТИРОВАНИЯ 2 ---
У меня есть UINavigationController, который детализирует примерно так:
HOMEPAGE > DETAIL PAGE > MAP VIEW
DETAIL PAGE добавляет пользовательский UIToolbar (с тремя кнопками) к rightBarButtonItem в viewDidLoad следующим образом:
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 1.0, 157.0, 44.1)];
[imgView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"NavigationBarBackground" ofType:@"png"]]];
[tools addSubview:imgView];
[tools sendSubviewToBack:imgView];
[tools setTintColor:[UIColor colorWithRed:127/255.0 green:184/255.0 blue:72/255.0 alpha:1.0]];
[imgView release];
NSMutableArray* buttons = [[NSMutableArray alloc] initWithCapacity:3];
UIBarButtonItem* bi = [[UIBarButtonItem alloc] initWithTitle:@"Filter" style:UIBarButtonItemStyleBordered target:self action:NULL];
[buttons addObject:bi];
[bi release];
bi = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Map.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(showMap:)];
[buttons addObject:bi];
[bi release];
bi = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Favourite.png"] style:UIBarButtonItemStyleBordered target:self action:NULL];
[buttons addObject:bi];
[bi release];
[tools setItems:buttons animated:NO];
[buttons release];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:tools];
Это прекрасно отображается при просмотре страницы DETAIL VIEW, и когда я перехожу к MAP VIEW, пользовательская панель UIToolbar исчезает (как и ожидалось), однако при возврате к DETAIL VIEW пользовательская панель UIToolbar больше не отображается. Тем не менее, он есть, поскольку я все еще могу коснуться области, где должна быть кнопка «Карта», и она возвращает меня к просмотру карты.
Не могли бы вы узнать, как можно снова отобразить эту панель UIToolbar при возврате к представлению DETAIL?
Я попытался перестроить пользовательский UIToolbar в viewWillAppear, который имеет те же эффекты, что и выше.
EDIT - Это работает, если я поместил код, который создает пользовательский UIToolbar, в метод viewDidAppear. Мне не нравится это решение, хотя, когда представление скользит назад, , а затем появляется пользовательский rightBarButtonItem. Это связано с тем, что навигационный контроллер не инициализируется перед отображением страницы?