(可选)设置导航栏背景图像

时间:2010-05-20 17:51:19

标签: objective-c iphone cocoa-touch

我需要在导航栏上绘制背景图像或设置色调颜色,但我还需要选项让导航栏像往常一样显示。我目前正在使用一个类别来支持如果我的应用程序没有指定背景图像,我可以做些什么来确保drawRect方法通常会这样做?

即。 -

@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect {
    if(hasImage){
        UIImage *img = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://myimageurl.com/img.jpg"]]];
        [img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    }else{
        ??????
    }
}
@end

2 个答案:

答案 0 :(得分:1)

我实际上最终做了一些完全不同的事情,我想知道为什么之前没有人发现过这个。我在谷歌搜索过程中看到的一种方法就是将图像作为子视图添加到UINavigationBar中。唯一的问题是这使得栏中的按钮无法点击。解决方法是禁用图像上的用户交互。

myUIImageView.userInteractionEnabled = NO; [myNavController.navigationBar addSubview:myUIImageView]; [myNavController.navigationBar sendSubviewToBack:myUIImageView];

有了它,一切看起来/效果都很好,我不必用类别,混合方法或任何那些时髦的东西来覆盖drawRect方法。简单干净。

答案 1 :(得分:0)

理论上,你可以通过继承UINavigationBar,只覆盖drawRect:方法,然后在你想使用默认行为时调用[super drawRect:rect]来做到这一点。

但我不相信你可以在实践中因为你没有直接实例化UINavigationBar。

解决这个问题是可能的,但是非常重要,因为类别方法“替换”了原始方法,而不是从运行时的角度对其进行子类化。这就是为什么只使用super,将无效。

您应该查看有关“超级”实施的帖子:http://cocoawithlove.com/2008/03/supersequent-implementation.html

(这个链接和其他一些相关的想法都在这个问题的答案中:Using Super in an Objective C Category?

相关问题