Я переопределил drawLayer: inContext: на UINavigationBar в категории, чтобы я мог поместить туда собственное изображение. Я ненавижу это, но мой клиент был непреклонен.
В результате мне пришлось прибегнуть к довольно уродливым хакерским действиям, чтобы добиться успеха. Мне пришлось поместить новый метод в эту категорию, чтобы поместить заголовок в заголовок панели навигации, и я должен вызывать его явно в -viewDidAppear
.
Я могу жить с этим. Реальная проблема в том, что когда памяти становится мало, кажется, что UINavigationBar выгружает свои подпредставления, включая мою кнопку назад! Я действительно не знаю, как оправиться от этого.
Вот моя категория UINavigationBar. Я получил этот код отсюда на SO, я думаю; Основная графика в основном заставляет мою голову кружиться.
@implementation UINavigationBar (background)
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
if([self isMemberOfClass: [UINavigationBar class]]){
UIImage *image = [UIImage imageNamed:@"top_bar.png"];
//CGContextClip(ctx);
CGContextTranslateCTM(ctx, 0, image.size.height - 20);
CGContextScaleCTM(ctx, 1.0, -1.0);
CGContextDrawImage(ctx, CGRectMake(0, 2, self.frame.size.width, self.frame.size.height), image.CGImage);
}
}
-(void)customTitle:(NSString *)text
{
UINavigationItem *top = self.topItem;
[[top.titleView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 40)];
title.textAlignment = UITextAlignmentCenter;
title.text = text;
title.textColor = [UIColor blackColor];
title.font = [UIFont boldSystemFontOfSize:16];
title.backgroundColor = [UIColor clearColor];
top.titleView = title;
[title release];
}
Есть ли более простой способ? Если нет, то как я могу сказать UINavigationBar: «Перезагрузите себя с помощью подпредставлений, которые у вас должны быть»?
ОБНОВЛЕНИЕ: Попытка переопределения -drawRect
вместо. Код проще, но проблема остается - в некоторых случаях кнопка возврата исчезает. Между прочим, я предполагаю, что это связано с тем, что я получил предупреждение. Кажется, это происходит только после возвращения из поездки через UIImagePicker, так что, возможно, что-то там происходит, чтобы что-то изменить. Кроме того, я включил NSZombies, и, очевидно, отключение этого параметра значительно меняет цвет лица.