Категория на UINavigationBar - только для определенных контроллеров - PullRequest
1 голос
/ 17 июня 2011

Я успешно реализовал панель навигации с пользовательским фоном после ответа, опубликованного на Пользовательский фон для проблем UINavigationBar .

Однако мне бы хотелось иметь стандартную панель навигации для некоторых моих контроллеров, и я понятия не имею, как мне этого добиться.

Если я запускаю новый проект на основе шаблона приложения на основе навигации и просто добавляю категорию UINavigationBar в отдельные файлы .h и .m, эта категория применяется немедленно. Не включает или что-то необходимое. Как это работает?

Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 17 июня 2011

Вот быстрый взлом - используйте свойство tag на панели навигации, чтобы включить пользовательский код, например

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    if (tag < 500) {
        // Drawing code 
        UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);
    } else {
        // Do the default drawing
    }
}
@end

Теперь контроллеры навигации с тегом менее 500 используют ваш собственный фон.Если вы установите для тега значение> 500, вы получите поведение по умолчанию.


EDIT

Как правильно заметил @MikeWeller, у нас нет доступа к первоначальной реализацииdrawRect, наша категория переопределила его.

Взгляните на эту ссылку для решения - в основном, это макрос, который вы можете включить, который дает вам дополнительный метод:

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    if (tag < 500) {
        // Drawing code 
        UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);
    } else {
        // Do the default drawing
        invokeSupersequent(rect);
    }
}
@end

NB. Я сам не пробовал этого, но с большим успехом использовал другие статьи из этого блога, поэтому я верю в это :) Дайте нам знать, как вы ладите!

0 голосов
/ 17 июня 2011
@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    if (tag < 500) {
        // Drawing code 
        UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);
    } else {
        // Do the default drawing
    }
}
@end

Помните, что этот метод не будет работать в iOS 5.0, потому что Apple изменила реализацию UINavigationBar, поэтому вместо этого создайте подкласс UINavigationBar и переопределите метод вместо создания категории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...