2010-11-02 44 views
0

我已經試過如下:UIToolbar類的drawRect:將不會工作

@implementation UIToolbar (Image) 

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

@end 

沒有任何成功,但它與UINavigationBar的+圖像完全相同的代碼工作完美。

drawRect方法沒有被調用UIToolbar,爲什麼?

+0

我知道,使用類別覆蓋的方法是在樣本廣泛使用。但是,蘋果文檔明確指出,你不應該這樣做,並建議使用子類化。 – Phlibbo 2010-11-02 09:20:03

回答

0

我找到了解決辦法

對於UIToolBar,如果你是一個UINavigationController內使用它,你要還覆蓋drawLayer:inContext的:,因爲這似乎可以用來代替的drawRect:當在導航控制器中使用,出於某種奇怪的原因。

來源:http://atastypixel.com/blog/making-uitoolbar-and-uinavigationbars-background-totally-transparent/

所以,我實現- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx代替:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { 
    CALayer *imgLayer = [[CALayer alloc] init]; 
    [imgLayer setContents:(id)[[UIImage imageNamed: @"toolbar.png"] CGImage]]; 
    [imgLayer setBounds:CGRectMake(0.0f, 0.0f, self.frame.size.width, self.frame.size.height)]; 
    [imgLayer setPosition:CGPointMake(self.bounds.size.width/2,self.bounds.size.height/2)]; 
    [layer insertSublayer:imgLayer atIndex:0]; 
} 
+1

同樣,我想強調的是,根據Apple的說法,使用類別覆蓋方法是錯誤的。這是不太可能的,但是你的代碼a)可能會在未來的平臺/未來的SDK上崩潰,b)理論上可能會被AppStore拒絕。您應該閱讀類別的準則,它是:'儘管當前語言允許您使用類別來覆蓋類繼承的方法,甚至是在類接口中聲明的方法,但是強烈建議您不要使用此功能。一個類別不能代替一個子類。「 – Phlibbo 2010-11-02 14:59:22

+1

最後我沒有使用子類,因爲我使用了3種不同的工具欄,圖像背景,純色背景和默認背景。但是,我的問題實際上是關於如何讓類別爲工具欄工作,而不是如果它是否是一個好主意。 – Erik 2010-11-07 18:04:31