3

我通过类别覆盖 drawRect 来向我的 UINavigationBar 添加自定义背景图像。

- ( void )drawRect:( CGRect )rect{
    [[UIImage imageNamed:@"navbar.png"] drawInRect:CGRectMake( 0, self.frame.size.height-44, self.frame.size.width, 44 )];
}

在您尝试使用 navigationitem.prompt 属性之前,此解决方案似乎工作正常。它不是做一个平滑的动画来呈现提示,而是突然地做。

关于如何解决这个问题有什么建议吗?或者另一种设置背景图像的方法。

PS。我试图避免仅将背景图像添加为子视图,因为视图推送/弹出时事物重新排列的方式。而且我不想在每个视图的 viewDidAppear 中发送SubviewToBack。

蒂亚!

编辑:我还尝试了方法 swizzling,如果我可以让我的图像拉伸,这会很好,但由于图像不可拉伸,我需要弄清楚如何利用碰巧进行换档而不是换档的动画拉紧。

编辑:请参阅下面的我的 hacky 答案

4

1 回答 1

0

非常“hacky”,但这是我可以让它做我想做的最接近的事情......

基本上当方法混用时,简单地让图像拉伸对我来说效果不佳,因为我也有圆角。因此,我将角落制作为单独的透明 img 并将其添加为子视图,这样它们就不会受到拉伸动画的影响。

所以我的类别现在看起来像这样..

#import "UINavigationBar+custom.h"

#define 角落标签 1

@implementation UINavigationBar (UINavigationBarCategory)

-(void)setCornersIfNeeded{
 UIImageView *corners = (UIImageView*)[self viewWithTag:cornersTag];
 如果(!角){
  UIImage *img = [[UIImage imageNamed:@"navbar_corners.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:0];
  角落 = [[[UIImageView alloc] initWithImage:img] autorelease];
  角.frame = CGRectMake(0, 0, self.frame.size.width, img.size.height);
  角点.tag = 角点标签;
  [自我添加子视图:角落];
 }
}

- (void)customDrawRect:(CGRect)rect{
 [self customDrawRect:rect];
 [[UIImage imageNamed:@"navbar.png"] drawInRect:rect];
 [自我设置CornersIfNeeded];
}

@结尾

有关方法调配的更多信息... http://www.cocoadev.com/index.pl?MethodSwizzlingiPhone 设备上的 Method Swizzle

于 2009-10-25T20:20:10.053 回答