titleView的奇怪行为,直到按下后退按钮才会出现

时间:2011-12-07 22:09:33

标签: iphone objective-c memory-management uinavigationcontroller uinavigationbar

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)!

我怀疑这是某种内存问题,但我无法解决它。

2 个答案:

答案 0 :(得分:2)

在iDev食谱How do iPhone apps Instagram/Reeder/DailyBooth implement custom NavigationBars with variable width back buttons?

中提到了您所遇到的问题

基本上你是以错误的方式添加你的背景。

仅支持iOS 5
实施类似setBackgroundImage:forBarMetrics:

的方法

支持较旧的iOS + iOS 5

  1. 子类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
    
  2. 要让UINavigationController使用您的子类,您需要使用xib创建它。

  3. enter image description here


    如果您已经在代码中设置了所有内容,那么您仍然需要使用笔尖来执行此操作。 我使用的笔尖没有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个子视图吗?