隐藏导航屏幕中的标签栏会导致iPhone SDK 3.1中的屏幕移动20像素

时间:2009-12-31 22:20:09

标签: iphone objective-c uinavigationbar uitabbar

Gentlepeople, 我是iPhone和iPhone的新手Objective-C,来自程序语言的长期背景。

我正在尝试模仿Whole Foods食谱搜索的功能。在该应用程序中,屏幕顶部有一个NavigationBar,底部有一个TabBar,屏幕顶部有一组三个按钮。选择按钮会从底部显示一个向上滑动的屏幕,覆盖TabBar。上滑屏幕包含一个选择器和一个“完成”按钮。这不是模态屏幕,因为您可以从上方选择不同的按钮,并且选择器将动态更改。此外,这不是行动表。

在重新创建此行为时,我使用了iPhone的ScrollViewSuite示例中的Autoscroll项目来呈现非模态的上滑屏幕。这很好用。我可以通过选择不同的按钮动态更改上滑屏幕中的选择器。

由于我想让幻灯片屏幕覆盖TabBar,我使用了http://osdir.com/ml/iPhoneSDKDevelopment/2009-01/msg00246.html的建议。简而言之,增加tabBarController.view.frame高度有效地使框架大于屏幕,并且从用户的视图中移除TabBar(锚定到底部)。上滑屏幕和隐藏TabBar的组合是可以接受的。生活相对乐观。我需要做的就是添加NavigationBar。

但是当我从视觉控制器中更改IB中的屏幕以使其成为Navigaion Controller屏幕时,我隐藏了TabBar时,我在视图中引入了20像素的移位!? NavigationBar本身很好,但是它下面的其他所有内容都会向上移动20个像素。 (然而,滑动屏幕仍然很好。)(20个像素是iPhone状态栏的高度。)

我的IB是标准安排,有一个带有TabBarCongroller的MainWindow.xib,以及其中的NavigationControllers。

以下是代码:

- (void)toggleThumbView 
{
 if (!thumbViewShowing) 
  { 
  [self createSlideUpViewIfNecessary]; // no-op if slideUpView has already been created

  //Hide the TabBar, which introduces a 20 pixel shift up of everything except the navigation bar
  UITabBar *ntoTabBar = self.tabBarController.tabBar;
  CGRect tbcFrame = self.tabBarController.view.frame; 
  self.tabBarController.view.frame = CGRectMake(tbcFrame.origin.x , 
               tbcFrame.origin.y  ,    
               tbcFrame.size.width , 
               tbcFrame.size.height + ntoTabBar.frame.size.height);

  //The following code really doesn't matter for discussions about the problem,  simply resizing the
  //tabBarController.view.frame above has already introduced the 20 pixel problem

  CGRect frame = [slideUpView frame];
        frame.origin.y -= frame.size.height ;
        frame.origin.y += ntoTabBar.frame.size.height ;

  [UIView beginAnimations:nil context:nil];
  [UIView setAnimationDuration:0.3];
  [slideUpView setFrame:frame];
  [UIView commitAnimations];

  thumbViewShowing = !thumbViewShowing;
  }  
}

我尝试过使用autoresizingMask和autoResizesSubviews。以下消除了20像素移位:

[self.tabBarController.view setAutoresizesSubviews:NO];

不幸的是,它也使TabBar不被隐藏。考虑到20像素可能是线索,我已经尝试在所有XIB上取消检查IB'想要全屏',但无济于事。我检查过&取消选中NIB的调整大小,我已经删除了所有的模拟接口元素,以便程序可以控制调整大小(我相信那些模拟禁止程序控制?)同样,似乎没有什么可以做的。将tbcFrame.origin.y增加20像素可以消除屏幕偏移,但会导致NavigationBar降低20像素,覆盖下面的任何内容并在顶部留下可爱的20像素边距。问题出现在3.0 SDK模拟器中,我升级到3.1.2。很高兴有最新/最好的,但它没有解决我的问题。

如果我不是秃头,我会把头发拉出来。任何关于在哪里看的建议将不胜感激。通过单独的ViewController推动上滑视图并消除TabBar的程序化隐藏会更好吗?类似的东西:

DetailViewController *dvc = [[DetailViewController alloc] init];
dvc.hidesBottomBarWhenPushed = YES;
[[self navigationController] pushViewController:dvc animated:YES];
[dvc release];

提前谢谢你,

鲍勃B.

1 个答案:

答案 0 :(得分:0)

所以,如果我能理解它,你的问题是你的“一种”模态视图被覆盖你的导航栏20px从底部,不是吗?

如果是,请尝试转到“一种”模式视图的NIB文件,并检查选项“状态栏”是否选中“无”。如果是这样,请尝试更改为“灰色”,例如。

我希望它能解决这个问题,如果没有,请告诉我,我会试着看看它会是什么。

干杯, VFN