内存警告删除UINavigationBar按钮

时间:2010-08-23 17:33:56

标签: iphone cocoa-touch core-graphics uinavigationbar

我已经覆盖了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,显然关闭它会显着改变记忆肤色。

1 个答案:

答案 0 :(得分:0)

为什么不在UINavigationBar类别中覆盖drawRect,而不是drawLayer:inContext:?

据我所知,这是一个非常干净的黑客,并且没有必要为你的标题提供自定义UILabel。

更新:您的内存警告信息更有意义。你在设置自定义后退按钮吗?当控制器收到内存警告时,如果控制器不在屏幕上,它会抛弃它的视图。导航控制器很有可能发生这种情况。如果你在一个init方法中设置自定义后退按钮,则无法将其重新添加到导航项内存警告清除。