【问题标题】:Optionally set navigationbar background image可选择设置导航栏背景图片
【发布时间】:2010-05-21 06:11:50
【问题描述】:

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

I.E. -

@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

【问题讨论】:

    标签: objective-c iphone cocoa-touch


    【解决方案1】:

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

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

    这样,一切看起来/工作得很好,我不必用类别、调配方法或任何时髦的东西来覆盖 drawRect 方法。简单干净。

    【讨论】:

      【解决方案2】:

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

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

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

      你应该看看这篇关于“supersequent”实现的帖子:http://cocoawithlove.com/2008/03/supersequent-implementation.html

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多