Я знаю два метода, и у каждого есть свои недостатки:
http://idevrecipes.com/2011/01/12/how-do-iphone-apps-instagramreederdailybooth-implement-custom-navigationbar-with-variable-width-back-buttons/ Это дает вам максимальная гибкость, вы можете настроить все на панели навигации. Однако вам нужно использовать конструктор интерфейса для создания панели навигации. Если вы создаете панель навигации программно, пользовательскую панель навигации создать невозможно. Пожалуйста, поправьте меня, если я ошибаюсь, я хотел бы знать решение.
http://sebastiancelis.com/2009/12/21/adding-background-image-uinavigationbar/ Все это делается программно, однако вы вынуждены отображать заголовок панели навигации и не можете настраивать кнопки.
Ребята, вы знаете какой-нибудь лучший метод? (Опять же, это для iOS 4.0, так как мне нужно, чтобы приложение было совместимо с iOS 4.0+)
Спасибо, парни,
Ответ 1 · рейтинг 3 · Owen Hartnett
Вам, вероятно, понадобятся два метода, обусловленные версией ОС. Это связано с тем, что в версии 5.0 и более поздних версиях функция drawRect не вызывается. Вместо этого в версии 5.0 есть собственные процедуры для пользовательской панели навигации. В итоге я использовал методы 4.0 и 5.0, а также определял версию и выбирал подходящую во время выполнения.
Что касается первого метода, я не понимаю, зачем вам действительно нужен конструктор интерфейсов. Просто программно создайте экземпляры своих объектов и добавьте их в качестве подпредставлений. Сам построитель интерфейсов не делает ничего большего - это просто более удобный способ работы с ними.
Ответ 2 · рейтинг 1 · bretdabaker
На самом деле, нет необходимости изменять методы, добавлять категории или использовать Interface Builder, вместо этого вы можете создать подкласс UINavigationBar и использовать NSKeyedUnarchiver, чтобы изменить класс UINavigationController.navigationBar на свой пользовательский подкласс.
+ (UINavigationController*)customizableNavigationControllerWithController:(UIViewController*)controller {
NSAssert(controller != nil, @"UINavigationController(CustomNavigationBar) customizableControllerWithController: controller can not be nil");
UINavigationController *navController = [[[UINavigationController alloc] initWithRootViewController:nil] autorelease];
NSData *navControllerData = [NSKeyedArchiver archivedDataWithRootObject:navController];
NSKeyedUnarchiver *unarchiver = [[[NSKeyedUnarchiver alloc] initForReadingWithData:navControllerData] autorelease];
[unarchiver setClass:[CustomNavigationBar class] forClassName:@"UINavigationBar"];
UINavigationController *customizableNavController = [unarchiver decodeObjectForKey:@"root"];
customizableNavController.viewControllers = [NSArray arrayWithObject:controller];
return customizableNavController;
}