【问题标题】:UIToolbar categories drawRect: won't workUIToolbar 类别 drawRect:不起作用
【发布时间】:2010-11-02 07:33:20
【问题描述】:

我尝试了以下方法:

@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 方法,这是为什么呢?

【问题讨论】:

  • 我知道使用类别覆盖方法在示例中被广泛使用。但是,Apple 的文档明确指出,您不应该这样做,并建议改用子类化。

标签: iphone objective-c uisearchbar uitoolbar categories


【解决方案1】:

我找到了解决办法

对于 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];
}

【讨论】:

  • 我想再次强调,根据 Apple 的说法,使用类别覆盖方法是错误的。这不太可能,但是您的代码 a) 可能会在未来的平台/未来的 SDK 上崩溃,并且 b) 理论上可能会被 AppStore 拒绝。您应该阅读类别指南,它说:“尽管该语言当前允许您使用类别来覆盖类继承的方法,甚至是在类接口中声明的方法,但强烈建议您不要使用此功能。类别不能替代子类。'
  • 最后我确实对它进行了子类化,因为我使用了 3 种不同类型的工具栏,图像背景、纯色背景和默认背景。但是,我的问题实际上是关于如何让类别适用于工具栏,而不是这样做是否是个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多