Подтвердить что ты не робот

Пользовательский 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)?

4b9b3361

Ответ 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.