我有一个自定义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
答案 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);
希望这有帮助