在viewDidLoad
我有一个UINavigationBar,其自定义背景以下列方式实现:
[self.navigationController.navigationBar insertSubview:[[UIImageView alloc] initWithImage:[UIImage imageNamed:nav_bg_image]] atIndex:100];
在堆栈顶部(称之为RVC
)我有以下完整代码:
UIImageView *logoView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:navbar_image_logo]];
[self.navigationController.navigationBar insertSubview:[[UIImageView alloc] initWithImage:[UIImage imageNamed:nav_bg_image]] atIndex:100];
[self.navigationItem setTitleView:logoView];
[logoView release];
这非常出色。但是,当我在堆栈上推送新VC
并在viewDidLoad
UIImageView *logoView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:navbar_image_logo]];
[self.navigationController.navigationBar insertSubview:[[UIImageView alloc] initWithImage:[UIImage imageNamed:nav_bg_image]] atIndex:1];
[self.navigationItem setTitleView:logoView];
[logoView release];
UIBarButtonItem *hButton = [[UIBarButtonItem alloc] initWithTitle:@"Filters" style:UIBarButtonItemStylePlain target:self action:@selector(filtersAction)];
self.navigationItem.rightBarButtonItem = hButton;
[hButton release];
“过滤器”按钮和titleView imageView都不会出现。但是,我知道过滤器按钮已添加到UI中,因为如果我单击它应该出现的区域,则会执行该操作。
此外,当我深入查看详细视图DVC
然后返回时,突然出现了titleView(logoView)!
我怀疑这是某种内存问题,但我无法解决它。
答案 0 :(得分:2)
基本上你是以错误的方式添加你的背景。
仅支持iOS 5
实施类似setBackgroundImage:forBarMetrics:
支持较旧的iOS + iOS 5
子类UINavigationBar
并实施drawRect
//.h
@interface CustomNavigationBar : UINavigationBar
@end
//.m
@implementation CustomNavigationBar
- (void)drawRect:(CGRect)rect;
{
UIImage *image = [[UIImage imageNamed: @"BackgroundImage"] stretchableImageWithLeftCapWidth:0 topCapHeight:0];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end
要让UINavigationController
使用您的子类,您需要使用xib创建它。
如果您已经在代码中设置了所有内容,那么您仍然需要使用笔尖来执行此操作。
我使用的笔尖没有File's Owner
,只包含Navigation Controller
,配置为使用我的CustomNavigationBar
且没有viewControllers
在这种情况下,我在这样的代码中进行设置:
// Load my nib with only a Navigation Controller and custom navigationBar
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomNavigationController" owner:nil options:nil];
// The only top level object will be my navigationController
UINavigationController *navigationController = [topLevelObjects objectAtIndex:0];
// Push a view controller to be the rootViewController
[navigationController pushViewController:rootViewController animated:NO];
然后出现这个控制器,但我通常会。显示它的控制器/窗口将采用UINavigationController
答案 1 :(得分:1)
您对insertSubView:atIndex:
方法的使用看起来很可疑。你在那个视图中真的有100个子视图吗?