Пользовательский UINavigationController UIToolbar Фоновое изображение - PullRequest
16 голосов
/ 14 июля 2010

У меня есть приложение для 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 вместо того, чтобы просто создавать панель инструментов подпредставления, потому что я использую слайд-анимацию setToolbarHidden.

У кого-нибудь есть идеи, возможно ли применить фоновое изображение к этой панели инструментов UINavigationController (скорее всего, переопределив метод drawRect)?

Ответы [ 4 ]

10 голосов
/ 31 октября 2010

Обновление:

В 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.

9 голосов
/ 24 июля 2010

Вам нужно создать подкласс вместо создания категории.

Я не совсем уверен, почему категория работает для 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. Нажмите на него, а затем в инспекторе идентичности измените класс на MyToolbar.

2 голосов
/ 08 июня 2012

Одним из лучших решений является создание категорий UINavigationBar и UIToolbar. Следующие классы дают вам решение для совместимости с iOS 4.0 и iOS 5.0:

Единственное, вам нужно вызвать следующие методы в вашем viewDidLoad, например:

// Customizacion de navigation bar y toolbar compatible con iOS4 e iOS5
[UINavigationBar iOS5UINavigationBarBackgroundImage];
[UIToolbar iOS5UIToolbarBackgroundImage];    

Итак, класс Class для совместимости с 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

Поздравил!

0 голосов
/ 21 февраля 2013

Простой вариант - создать подкласс UINavigationBar / UIToolbar и инициализировать контроллер навигации, используя метод:

- (instancetype)initWithNavigationBarClass:(Class)navigationBarClass toolbarClass:(Class)toolbarClass

Однако для простых настроек (таких как фоновые изображения, тени и т. Д.) Я бы рекомендовал использовать шаблон протокола UIAppearance.

...