【问题标题】:UINavigationBar jumping up when app becomes active应用程序激活时 UINavigationBar 跳起来
【发布时间】:2011-02-25 01:31:38
【问题描述】:

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

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

@implementation MyUINavigationBar


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


@end

此时该栏未正确显示。在我的应用程序委托的- (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 或应用委托的 applicationDidBecomeActive 中应用新框架,但这没有帮助。

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

【问题讨论】:

标签: iphone cocoa-touch uinavigationcontroller uinavigationbar


【解决方案1】:

我花了几天的时间来解决这个问题,这是一个真正适用于完整的自定义后退按钮的技巧。

backBarButtonItem 完全锁定在 iOS SDK 中(据我所知是 4.3),所以我们必须使用 leftBarButtonItem 来代替常规的后退按钮。

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

这段代码在我的根视图控制器中(这是一个UITableViewDelegate),在-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

[[self navigationController] pushViewController:nextViewController animated:YES];

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

-(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];        

}

玩得开心;)

【讨论】:

    【解决方案2】:

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

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

    希望对你有帮助

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 2019-12-01
    • 2011-07-24
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多