2010-08-23 101 views
0

我已重寫drawLayer:inContext:在UINavigationBar中的一個類別,以便我可以將自定義圖像放在那裏。我討厭它,但我的客戶堅持不懈。內存警告消除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

爲什麼不在你的UINavigationBar類中重寫drawRect,而不是drawLayer:inContext:?

據我所知,這是一個非常乾淨的破解,並且沒有必要爲您的標題提供自定義UILabel。

更新:有關內存警告的信息更有意義。你是否設置了自定義後退按鈕?當控制器接收到內存警告時,如果它不在屏幕上,它會拋棄它的視圖。導航控制器發生這種情況的可能性很大。如果你正在設置一個自定義後退按鈕,比如init方法,那麼將無法將其重新添加到導航項目內存後警告清除。

+0

請參閱我的更新。 – 2010-08-24 11:59:52