iphone - 如何在不使用 drawRect 类别的情况下将图像设置为导航栏背景?

标签 iphone ios ios4 uinavigationcontroller uinavigationbar

我想为我的 iphone 应用程序的导航栏设置图像背景。大多数解决方案建议在以下类别中使用 drawRect:

@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect {
    UIImage *image = [UIImage imageNamed: @"NavigationBar.png"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end

但是,苹果不推荐这个 .还有什么建议吗?

感谢您的帮助,

斯蒂芬妮

最佳答案

Apple 强烈建议我们使用子类而不是类别(WWDC 2011,Session 123)。

创建一个实现 drawRect: 的子类方法并将导航栏的类设置为您的自定义类:

  • 如果您在 Interface Builder 中工作,请更改检查器中的类
  • 如果你创建一个独立的导航栏(没有导航 Controller ),实例化你的自定义类
  • 如果您以编程方式创建导航 Controller ,则可以利用 ObjC 运行时。

  • 运行时的类切换:
     #import <objc/runtime.h>
     ...
     object_setClass(theNavController.navigationBar, [CustomNavigationBar class]);
    

    您还应该避免使用 [UIImage imageNamed:...]每次在 drawRect:因为它可能会影响性能(对于动画)。将其缓存在 ivar 中:
     if (!bgImage) {
         bgImage = [[UIImage imageNamed:@"NavigationBar.png"] retain];
     }
     [bgImage drawInRect:...];
    

    (并在 dealloc 中释放它)

    注:由于 iOS 5 仍处于保密协议(protocol)下,我无法提及如何轻松添加背景图像。查看 UINavigationBar 的文档。

    关于iphone - 如何在不使用 drawRect 类别的情况下将图像设置为导航栏背景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7348742/

    相关文章:

    iphone - iOS iphone uialertview 在横向添加了另一个 TextView

    ios - 如何将 UISearchBar 图标更改为自定义图像?

    ios - XCode 将文件构建到应用程序中

    ios - UICollectionViewController Insets 无法正确调整和滚动

    objective-c - 将背景图像设置为uitableview?

    iphone - 具有快速 modpow 的 BSD 许可大整数 C 库

    javascript - 如果不是 HREF Javascript 那么什么 [例如手机]

    iphone - 签名者无效错误

    ios4 - dateFromString 在 24 小时更改后返回 nil

    由 mosync 框架构建的 iPhone 应用程序