我已经覆盖了drawLayer:inContext:在类别中的UINavigationBar上,以便我可以在那里放置自定义图像。我讨厌它,但我的客户是坚定的。
结果,我不得不回到一些非常丑陋的黑客来把事情搞定。我必须在该类别中添加一个新方法,以在导航栏标题上添加标题,我必须在-viewDidAppear
中明确地调用它。
我可以忍受。真正的问题是,当内存变低时,看起来UINavigationBar正在卸载其子视图,包括我的后退按钮!我真的不知道如何从中恢复过来。
这是我的UINavigationBar类别。我从这里得到这个代码,我想;核心图形大多只是让我头晕目眩。
@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,显然关闭它会显着改变记忆肤色。
答案 0 :(得分:0)
为什么不在UINavigationBar类别中覆盖drawRect,而不是drawLayer:inContext:?
据我所知,这是一个非常干净的黑客,并且没有必要为你的标题提供自定义UILabel。
更新:您的内存警告信息更有意义。你在设置自定义后退按钮吗?当控制器收到内存警告时,如果控制器不在屏幕上,它会抛弃它的视图。导航控制器很有可能发生这种情况。如果你在一个init方法中设置自定义后退按钮,则无法将其重新添加到导航项内存警告清除。