您可以覆盖UINavigationBar 类别类中的drawLayer:inContext:方法,而不是在drawRect:中执行此操作。在drawLayer:inContext:方法中,您可以绘制您想要使用的背景图像。如果您的应用支持多种界面方向,您还可以为纵向和横向界面方向选择不同的图像。
- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
if ([self isMemberOfClass:[UINavigationBar class]] == NO) {
return;
}
UIImage *image = (self.frame.size.width > 320) ?
[UINavigationBar bgImageLandscape] : [UINavigationBar bgImagePortrait];
CGContextClip(context);
CGContextTranslateCTM(context, 0, image.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
}
这个关于自定义 UINavigationBar 外观的完整演示 Xcode 项目也可能会有所帮助。