2009-10-25 23 views
3

我通過重寫通過類別的drawRect添加自定義背景圖像到我的UINavigationBar。UINavigationBar通過drawRect的背景圖像 - 問題與提示動畫

 
- (void)drawRect:(CGRect)rect{ 
    [[UIImage imageNamed:@"navbar.png"] drawInRect:CGRectMake(0, self.frame.size.height-44, self.frame.size.width, 44)]; 
} 

該解決方案似乎做工精細,直到您嘗試使用navigationitem.prompt財產。 而不是做一個平滑的動畫呈現提示,它突然做。

有沒有關於如何解決這個問題的建議?或者設置背景圖像的另一種方式。

PS。我試圖避免只是添加一個背景圖像作爲子視圖,因爲事情重新排列的方式時,視圖推/流行。而且我討厭在每個視圖的viewDidAppear中發送SubviewToBack。

TIA!

編輯:我也試過方法swizzling,這將工作得很好,如果我可以讓我的圖像伸展,但由於圖像不可拉伸,我需要弄清楚如何挖掘動畫,碰巧做一個移動而不是拉伸。

編輯:看我下面

+0

至於你是如何實現的drawRect:,你可能想看看http://stackoverflow.com/questions/1085479/override-a-method-via-objc-category-and-call-the-default-implementation – 2009-10-25 15:34:23

+0

我其實也嘗試方法swizzling這個特殊的drawRect,但結果並不令人滿意。它恢復原始動畫,但自定義圖像仍然只是「彈出」。 – dizy 2009-10-25 16:48:00

+0

其實我只是意識到我的方法swizzling不能在設備上編譯。在iPhone設備上可能會翻轉嗎? – dizy 2009-10-28 14:23:58

回答

0

所以很「哈克」哈克的答案,但是這是最接近我能得到它做我想做什麼?

基本上當法混寫,只是讓圖像拉伸對我來說效果不佳,因爲我也有圓角。所以相反,我把角落做成了一個單獨的透明img,並將其添加爲子視圖,這樣他們就不會受到拉伸動畫的影響。

所以,我的類別,現在看起來是這樣的..

 
#import "UINavigationBar+custom.h" 

#define cornersTag 1 

@implementation UINavigationBar (UINavigationBarCategory) 

-(void)setCornersIfNeeded{ 
UIImageView *corners = (UIImageView*)[self viewWithTag:cornersTag]; 
if(!corners){ 
    UIImage *img = [[UIImage imageNamed:@"navbar_corners.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:0]; 
    corners = [[[UIImageView alloc] initWithImage:img] autorelease]; 
    corners.frame = CGRectMake(0, 0, self.frame.size.width, img.size.height); 
    corners.tag = cornersTag; 
    [self addSubview:corners]; 
} 
} 

- (void)customDrawRect:(CGRect)rect{ 
[self customDrawRect:rect]; 
[[UIImage imageNamed:@"navbar.png"] drawInRect:rect]; 
[self setCornersIfNeeded]; 
} 

@end 

更多關於法混寫... http://www.cocoadev.com/index.pl?MethodSwizzlingMethod Swizzle on iPhone device

+0

我不知道我明白你爲什麼需要一個第二張圖像和所有的圖像,以防止圖像被拉伸......你正在做所有的繪圖,你不控制它被繪製的高寬比嗎?或者圖像總是需要填充視圖的問題,但視圖可以以不同的形狀存在? (另外,要小心,因爲傳遞給drawRect中的矩形可能*不*是完整的幀/視圖的邊界。) – 2009-10-26 02:51:03

+0

如果我有圓角的圖像,我讓它伸展,邊角得到扭曲。如果我不讓它伸展,並且會讓它滑下來,那麼這是我無法做到的。這似乎是它吸引展開狀態幀一次,但綿延下來的摺疊狀態,然後動畫的擴大伸展它回到初始膨脹平局。在什麼情況下,矩形可能不是全幀/邊界?如果它的正常工作對我來說,我應該還是會擔心? – dizy 2009-10-26 20:33:13