当应用程序变为活动状态时,UINavigationBar会跳起来

时间:2011-02-25 01:31:38

标签: iphone cocoa-touch uinavigationcontroller uinavigationbar

我有一个自定义UINavigationBar,它具有与默认图像背景和高度不同的图像背景和高度。它显示正常,但只要我在应用程序之间来回移动,导航栏中的背景图像和按钮就会跳起来。

UINavigationBar是在一个nib中创建的,它有一个自定义类,它会覆盖默认实现以添加图像:

@implementation MyUINavigationBar


- (void)drawRect:(CGRect)rect {
    UIImage *image = [UIImage imageNamed: @"nav.png"];
    rect.size.height = 60;
    [image drawInRect:rect];
}


@end

此时条形图未正确显示。在我的app委托的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中,我使用以下代码修复此问题:

self.navigationController.view.frame = CGRectMake(0, 20, 320, 460);
self.navigationController.navigationBar.frame = CGRectMake(0, 0, 320, 60);

现在一切都正确显示了。当我切换到另一个应用程序并再次返回时,条形图会跳起来,就像没有应用框架一样。这种情况发生在我切换回应用程序之后。

以下两个屏幕截图显示了正在发生的事情。第一个显示正确的版本,另一个显示错误的版本。

知道可能会发生什么吗?我尝试在活动视图的viewWillAppear和viewDidAppear中应用新框架,或者在app delegate的applicationDidBecomeActive中应用新框架,但这没有帮助。

https://skitch.com/instromaniac/rtagr/ios-simulator https://skitch.com/instromaniac/rtaf9/view-not-ok

2 个答案:

答案 0 :(得分:1)

我花了好几天才弄清楚这一点,这是一个真正适用于完整的,定制的backButton的技巧。

backBarButtonItem完全锁定在iOS SDK中(据我所知4.3),因此我们必须使用leftBarButtonItem来代替常规后退按钮。< / p>

虽然必须在UINavigationController的根视图控制器中定义backBarButtonItem,但我们必须在子视图中设置我们的假BackButton(即我的示例中的nextViewController)。

此代码位于UITableViewDelegate

中的根视图控制器(-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath)中
[[self navigationController] pushViewController:nextViewController animated:YES];

这是在70px自定义UINavigationBar中显示我们的假后退按钮的重要因素(使用框架来满足您的需求):

-(void)handleBack:(id)sender {
    // Simulate the original back button
    [self.navigationController popViewControllerAnimated:YES];    
}

-(void)viewWillAppear:(BOOL)animated {

    // Making a custom button
    UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom];    
    [backBtn setImage:[UIImage imageNamed:@"back-button.png"] forState:UIControlStateNormal];    
    [backBtn setImage:[UIImage imageNamed:@"back-button-hover.png"] forState:UIControlStateHighlighted];    
    [backBtn setImage:[UIImage imageNamed:@"back-button-disabled.png"] forState:UIControlStateDisabled];    
    [backBtn setFrame:CGRectMake(6, 4, 60, 30)];

    // Binding custom target & action to the button
    [backBtn addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside];

    // Nesting the button in a UIView to position the button anywhere!
    UIView *backView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 60, 70)];
    [backView addSubview:backBtn];

    // Nesting all of these into a UIBarButtonItem
    UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithCustomView:backView];

    // Overwrite original backbutton (self.navigationItem.backBarButtonItem DO NOT WORK HERE 
    self.navigationItem.leftBarButtonItem = backItem;

    // Memory clean up
    [backItem release];
    [backView release];        

}

玩得开心;)

答案 1 :(得分:0)

尝试将导航控制器视图的框架更改为

self.navigationController.view.frame = CGRectMake(0,0,320,480);

希望这有帮助