Iphone UIToolbar类别drawRect:不起作用

Iphone UIToolbar类别drawRect:不起作用,iphone,objective-c,uisearchbar,uitoolbar,categories,Iphone,Objective C,Uisearchbar,Uitoolbar,Categories,我尝试了以下方法: @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 没有任何成功,但它与UINav

我尝试了以下方法:

@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+Image的代码完全相同

UIToolbar没有调用drawRect方法,这是为什么?

我找到了一个解决方案

对于UIToolBar,如果您在UINavigationController中使用它,您还需要覆盖drawLayer:inContext:,因为出于某种奇怪的原因,在导航控制器中使用它时,它似乎是用来代替drawRect:

资料来源:

因此我实现了-voiddrawLayer:CALayer*层inContext:CGContextRefctx:


我知道,使用类别覆盖方法在示例中被广泛使用。然而,Apple文档明确指出,您不应该这样做,并建议改用子类化。我想再次强调,根据Apple的说法,使用类别覆盖方法是错误的。这不太可能,但您的代码a可能会在未来的平台上崩溃/使用未来的SDK,而b理论上可能会被AppStore拒绝。您应该阅读categories的指南,它说:“尽管当前语言允许您使用categories来覆盖类继承的方法,甚至覆盖类接口中声明的方法,但强烈建议您不要使用此功能。一个类别不能代替一个子类。最后,我把它子类化了,因为我使用了3种不同的工具栏,图像背景、纯色背景和默认背景。但是,我的问题实际上是如何让类别在工具栏上工作,而不是这样做是否是个好主意。
- (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];
}