Пользовательский UINavigationController UIToolbar Фоновое изображение
У меня есть приложение iPhone с помощью UINavigationController
и вы хотите настроить элементы с пользовательскими фоновыми изображениями. Я смог сделать это для UINavigationController's
UINavigationBar
довольно легко, используя категории Objective-C, как показано ниже:
http://foobarpig.com/iphone/uinavigationbar-with-solid-color-or-image-background.html
Я хотел бы сделать то же самое для UINavigationController's
UIToolbar
, но тот же подход, похоже, не работает (хотя я понятия не имею, почему нет). Я огляделся, и люди, похоже, предложите подклассу UIToolbar
, но это невозможно для панели инструментов UINavigationController's
, которая доступна только для чтения UIToolbar
. Я хочу использовать панель инструментов UINavigationController's
вместо создания панели инструментов subview, потому что я использую анимацию слайдов setToolbarHidden
.
Кто-нибудь знает, возможно ли применить фоновое изображение к этой панели инструментов UINavigationController
(скорее всего, каким-то образом переопределив метод drawRect
)?
Ответы
Ответ 1
Вам нужно подкласс вместо создания категории.
Я не слишком уверен, почему категория работает для UINavigationBar
, но не UIToolbar
, но подклассы работают для обоих из них, и я думаю, что это более стандартный способ настройки таких вещей.
Итак, для подкласса UIToolbar
создайте класс под названием MyToolbar
(или что-то подобное) и поместите его в .h:
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
@interface MyToolbar : UIToolbar {}
- (void)drawRect:(CGRect)rect;
@end
И это в файле .m:
#import "MyToolbar.h"
@implementation MyToolbar
- (void)drawRect:(CGRect)rect {
backgroundImage = [UIImage imageNamed:@"my-awesome-toolbar-image.png"];
[backgroundImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end
Оттуда вы должны сказать контроллеру навигации использовать MyToolbar
вместо UIToolbar
. Самый простой способ, который я нашел, - выбрать ваш контроллер навигации в построителе интерфейса, а затем в инспекторе атрибутов установите флажок "Показать панель инструментов". Панель инструментов должна отображаться в окне NavigationController
. Нажмите на него, а затем в Identity Inspector измените класс на MyToolbar
.
Ответ 2
Update:
В iOS 5.0+ теперь вы можете использовать UIAppearance
для настройки панели навигации.
Другой способ сделать это - просто создать класс категории для вашего приложения UINavigationBar
. Это было довольно просто реализовать:
Интерфейс:
@interface UINavigationBar (TENavigationBar)
- (void) drawRect:(CGRect)rect;
@end
Реализация:
@implementation UINavigationBar (TENavigationBar)
- (void) drawRect:(CGRect)rect
{
UIImage *image = [UIImage imageNamed:@"navigation_background"];
[image drawInRect:CGRectMake(0,
0,
self.frame.size.width,
self.frame.size.height)];
}
@end
Затем это будет глобально применено ко всем вашим UINavigationBar
автоматически.
Ответ 3
Одним из лучших решений является создание категории UINavigationBar и UIToolbar. Следующие классы дают вам решение для совместимости с iOS 4.0 и iOS 5.0:
Единственное, что вам нужно, чтобы вызвать следующие методы в вашем viewDidLoad, например:
// Customizacion de navigation bar y toolbar compatible con iOS4 e iOS5
[UINavigationBar iOS5UINavigationBarBackgroundImage];
[UIToolbar iOS5UIToolbarBackgroundImage];
Итак, класс Category для совместимости с iOS 4.0 и iOS 5.0 для настройки результатов BackgroundImage выглядит следующим образом:
@implementation UINavigationBar (BackgroundImage)
- (void)drawRect:(CGRect)rect
{
UIImage* img = [UIImage imageNamed: @"navigation-bg.png"];
[img drawInRect: CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
[self setTintColor:UIColorFromRGB(0x5ca666)];
}
+ (void) iOS5UINavigationBarBackgroundImage
{
if ([UINavigationBar respondsToSelector: @selector(appearance)])
{
[[UINavigationBar appearance] setBackgroundImage: [UIImage imageNamed: @"navigation-bg.png"] forBarMetrics: UIBarMetricsDefault];
[[UINavigationBar appearance] setTintColor:UIColorFromRGB(0x5ca666)];
}
}
@end
@implementation UIToolbar (BackgroundImage)
- (void)drawRect:(CGRect)rect
{
UIImage *image = [UIImage imageNamed: @"toolbar-bg.png"];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
[self setTintColor:UIColorFromRGB(0x5ca666)];
}
+ (void) iOS5UIToolbarBackgroundImage
{
if ([UIToolbar respondsToSelector: @selector(appearance)])
{
[[UIToolbar appearance] setBackgroundImage:[UIImage imageNamed: @"toolbar-bg.png"] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];
[[UIToolbar appearance] setTintColor:UIColorFromRGB(0x5ca666)];
}
}
@end
Поздравил!
Ответ 4
Простая опция заключается в подклассе UINavigationBar/UIToolbar и инициализации контроллера навигации с помощью метода:
- (instancetype)initWithNavigationBarClass:(Class)navigationBarClass toolbarClass:(Class)toolbarClass
Однако для простых настроек (в качестве фоновых изображений, теней и т.д.) я бы рекомендовал использовать шаблон протокола UIAppearance
.